diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9b3ca0ccc..1a69c1eb1 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -2311,3 +2311,25 @@ const luaR_value_entry opentxConstants[] = { { nullptr, 0 } /* sentinel */ }; + +const luaR_string_entry edgetxStrings[] = { + { "CHAR_RIGHT", STR_CHAR_RIGHT }, + { "CHAR_LEFT", STR_CHAR_LEFT }, + { "CHAR_UP", STR_CHAR_UP }, + { "CHAR_DOWN", STR_CHAR_DOWN }, + { "CHAR_DELTA", STR_CHAR_DELTA }, + { "CHAR_STICK", STR_CHAR_STICK }, + { "CHAR_POT", STR_CHAR_POT }, + { "CHAR_SLIDER", STR_CHAR_SLIDER }, + { "CHAR_SWITCH", STR_CHAR_SWITCH }, + { "CHAR_TRIM", STR_CHAR_TRIM }, + { "CHAR_INPUT", STR_CHAR_INPUT }, + { "CHAR_FUNCTION", STR_CHAR_FUNCTION }, + { "CHAR_CYC", STR_CHAR_CYC }, + { "CHAR_TRAINER", STR_CHAR_TRAINER }, + { "CHAR_CHANNEL", STR_CHAR_CHANNEL }, + { "CHAR_TELEMETRY", STR_CHAR_TELEMETRY }, + { "CHAR_LUA", STR_CHAR_LUA }, + + { nullptr, "" } /* sentinel */ +}; \ No newline at end of file diff --git a/radio/src/thirdparty/Lua/src/lapi.c b/radio/src/thirdparty/Lua/src/lapi.c index 070b11d62..2d95f28ed 100644 --- a/radio/src/thirdparty/Lua/src/lapi.c +++ b/radio/src/thirdparty/Lua/src/lapi.c @@ -626,7 +626,7 @@ LUA_API void lua_getglobal (lua_State *L, const char *var) { const TValue *gt; /* global table */ lua_lock(L); - found = luaR_findglobal(var, &value); + found = luaR_findglobal(L, var, &value); if (found && ttislightfunction(&value)) { setsvalue2s(L, L->top++, luaS_new(L, var)); setlfvalue(L->top - 1, lfvalue(&value)) diff --git a/radio/src/thirdparty/Lua/src/linit.c b/radio/src/thirdparty/Lua/src/linit.c index 14be891d1..05ef2083f 100644 --- a/radio/src/thirdparty/Lua/src/linit.c +++ b/radio/src/thirdparty/Lua/src/linit.c @@ -45,18 +45,18 @@ static const luaL_Reg loadedlibs[] = { /* The read-only tables are defined here */ const luaR_table lua_rotable[] = { - {"__opentx", opentxLib, opentxConstants}, - {"lcd", lcdLib, NULL}, - {"model", modelLib, NULL}, - {"__baselib", baselib, NULL}, - {LUA_IOLIBNAME, iolib, NULL}, - {LUA_STRLIBNAME, strlib, NULL}, - {LUA_MATHLIBNAME, mathlib, mathlib_vals}, - {LUA_BITLIBNAME, bitlib, NULL}, + {"__opentx", opentxLib, opentxConstants, edgetxStrings}, + {"lcd", lcdLib, NULL, NULL}, + {"model", modelLib, NULL, NULL}, + {"__baselib", baselib, NULL, NULL}, + {LUA_IOLIBNAME, iolib, NULL, NULL}, + {LUA_STRLIBNAME, strlib, NULL, NULL}, + {LUA_MATHLIBNAME, mathlib, mathlib_vals, NULL}, + {LUA_BITLIBNAME, bitlib, NULL, NULL}, #if defined(COLORLCD) - {LUA_TABLIBNAME, tab_funcs, NULL}, + {LUA_TABLIBNAME, tab_funcs, NULL, NULL}, #endif - {NULL, NULL, NULL} + {NULL, NULL, NULL, NULL} }; /* diff --git a/radio/src/thirdparty/Lua/src/lrotable.c b/radio/src/thirdparty/Lua/src/lrotable.c index 22f4d32a8..838536bc2 100644 --- a/radio/src/thirdparty/Lua/src/lrotable.c +++ b/radio/src/thirdparty/Lua/src/lrotable.c @@ -3,40 +3,63 @@ #include #include "lua.h" #include "lauxlib.h" +#include "lstring.h" #include "lrotable.h" -/* Local defines */ -#define LUAR_FINDFUNCTION 0 -#define LUAR_FINDVALUE 1 +/* Utility function: find a key in a given table of functions */ +static luaR_result luaR_findfunctionkey(const luaL_Reg* pf, const char * key, TValue * found) { + if(!pf) + return 0; -/* Utility function: find a key in a given table (of functions or constants) */ -static luaR_result luaR_findkey(const void * where, const char * key, int type, TValue * found) { - const char *pname; - const luaL_Reg *pf = (luaL_Reg*)where; - const luaR_value_entry *pv = (luaR_value_entry*)where; - int isfunction = type == LUAR_FINDFUNCTION; - if(!where) - return 0; while(1) { - if (!(pname = isfunction ? pf->name : pv->name)) + if (!pf->name) break; - if (!strcmp(pname, key)) { - if (isfunction) { - setlfvalue(found, pf->func); - } - else { - setnvalue(found, pv->value); - } + if (!strcmp(pf->name, key)) { + setlfvalue(found, pf->func); return 1; } - pf ++; pv ++; + pf++; } return 0; } +/* Utility function: find a key in a given table of constants */ +static luaR_result luaR_findconstantkey(const luaR_value_entry* pv, const char * key, TValue * found) { + if(!pv) + return 0; + + while(1) { + if (!pv->name) + break; + if (!strcmp(pv->name, key)) { + setnvalue(found, pv->value); + return 1; + } + pv++; + } + return 0; +} + +/* Utility function: find a key in a given table of strings */ +static luaR_result luaR_findstringkey(lua_State *L, const luaR_string_entry* ps, const char * key, TValue * found) { + if(!ps) + return 0; + + while(1) { + if (!ps->name) + break; + if (!strcmp(ps->name, key)) { + TString *ts = luaS_new(L, ps->string); + setsvalue(L, found, ts); + return 1; + } + ps++; + } + return 0; +} /* Find a global "read only table" in the constant lua_rotable array */ -luaR_result luaR_findglobal(const char * name, TValue * val) { +luaR_result luaR_findglobal(lua_State *L, const char * name, TValue * val) { unsigned i; if (strlen(name) > LUA_MAX_ROTABLE_NAME) { TRACE_LUA_INTERNALS("luaR_findglobal('%s') = NAME TOO LONG", name); @@ -50,7 +73,7 @@ luaR_result luaR_findglobal(const char * name, TValue * val) { return 1; } if (!strncmp(lua_rotable[i].name, "__", 2)) { - if (luaR_findentry(table, name, val)) { + if (luaR_findentry(L, table, name, val)) { TRACE_LUA_INTERNALS("luaR_findglobal('%s') = FOUND in table '%s'", name, lua_rotable[i].name); return 1; } @@ -61,18 +84,23 @@ luaR_result luaR_findglobal(const char * name, TValue * val) { } -luaR_result luaR_findentry(void *data, const char * key, TValue * val) { +luaR_result luaR_findentry(lua_State *L, void *data, const char * key, TValue * val) { luaR_table * table = (luaR_table *)data; /* First look at the functions */ - if (luaR_findkey(table->pfuncs, key, LUAR_FINDFUNCTION, val)) { + if (luaR_findfunctionkey(table->pfuncs, key, val)) { TRACE_LUA_INTERNALS("luaR_findentry(%p[%s], '%s') = FUNCTION %p", table, table->name, key, lfvalue(val)); return 1; } - else if (luaR_findkey(table->pvalues, key, LUAR_FINDVALUE, val)) { + else if (luaR_findconstantkey(table->pvalues, key, val)) { /* Then at the values */ TRACE_LUA_INTERNALS("luaR_findentry(%p[%s], '%s') = NUMBER %g", table, table->name, key, nvalue(val)); return 1; } + else if (luaR_findstringkey(L, table->pstrings, key, val)) { + /* Then at the strings */ + TRACE_LUA_INTERNALS("luaR_findentry(%p[%s], '%s') = STRING %s", table, table->name, key, svalue(val)); + return 1; + } TRACE_LUA_INTERNALS("luaR_findentry(%p[%s], '%s') = NOT FOUND", table, table->name, key); return 0; } diff --git a/radio/src/thirdparty/Lua/src/lrotable.h b/radio/src/thirdparty/Lua/src/lrotable.h index 1b935f4d1..788d426de 100644 --- a/radio/src/thirdparty/Lua/src/lrotable.h +++ b/radio/src/thirdparty/Lua/src/lrotable.h @@ -17,9 +17,17 @@ typedef struct lua_Number value; } luaR_value_entry; +// A string entry in the read only table +typedef struct +{ + const char *name; + const char *string; +} luaR_string_entry; + extern const luaR_value_entry baselib_vals[]; extern const luaR_value_entry mathlib_vals[]; extern const luaR_value_entry opentxConstants[]; +extern const luaR_string_entry edgetxStrings[]; // A mapping between table name and its entries typedef struct @@ -27,11 +35,12 @@ typedef struct const char *name; const luaL_Reg *pfuncs; const luaR_value_entry *pvalues; + const luaR_string_entry *pstrings; } luaR_table; extern const luaR_table lua_rotable[]; -luaR_result luaR_findglobal(const char * name, TValue * val); -luaR_result luaR_findentry(void * data, const char * key, TValue * val); +luaR_result luaR_findglobal(lua_State *L, const char * name, TValue * val); +luaR_result luaR_findentry(lua_State *L, void * data, const char * key, TValue * val); #endif diff --git a/radio/src/thirdparty/Lua/src/lvm.c b/radio/src/thirdparty/Lua/src/lvm.c index 90950e038..d4bb2381b 100644 --- a/radio/src/thirdparty/Lua/src/lvm.c +++ b/radio/src/thirdparty/Lua/src/lvm.c @@ -123,7 +123,7 @@ void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { char keyname[LUA_MAX_ROTABLE_NAME + 1]; lua_getcstr(keyname, rawtsvalue(key), LUA_MAX_ROTABLE_NAME); TRACE_LUA_INTERNALS("luaV_gettable(%s)", keyname); - luaR_findentry(rvalue(t), keyname, val); + luaR_findentry(L, rvalue(t), keyname, val); } return; } @@ -624,7 +624,7 @@ void luaV_execute (lua_State *L) { char keyname[LUA_MAX_ROTABLE_NAME + 1]; lua_getcstr(keyname, rawtsvalue(RKC(i)), LUA_MAX_ROTABLE_NAME); TRACE_LUA_INTERNALS("luaV_execute(OP_GETTABUP, %s)", keyname); - if (luaR_findglobal(keyname, ra)) { + if (luaR_findglobal(L, keyname, ra)) { break; } }