From b0fb80b264ab728c0c225b7ab908553d0ba28398 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 9 Jun 2021 09:24:48 +0200 Subject: [PATCH] ZChar nightmare / take 2 --- radio/src/lua/api_general.cpp | 39 +++++++++++++++-------------------- radio/src/lua/api_model.cpp | 38 +++++++++++++++++----------------- radio/src/lua/lua_api.h | 13 ++++++++++++ 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9ef7577b2..47eced18b 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -362,22 +362,20 @@ bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags) // search in telemetry field.desc[0] = '\0'; - for (int i=0; i 0) { - str2zchar(zname, name, 4); - } - else { - zname[0] = hex2zchar((id & 0xf000) >> 12); - zname[1] = hex2zchar((id & 0x0f00) >> 8); - zname[2] = hex2zchar((id & 0x00f0) >> 4); - zname[3] = hex2zchar((id & 0x000f) >> 0); + if (name == NULL || strlen(name) > 0) { + name_buf[0] = hex2char((id & 0xf000) >> 12); + name_buf[1] = hex2char((id & 0x0f00) >> 8); + name_buf[2] = hex2char((id & 0x00f0) >> 4); + name_buf[3] = hex2char((id & 0x000f) >> 0); } if (id | subId | instance) { - int index = setTelemetryValue(PROTOCOL_TELEMETRY_LUA, id, subId, instance, value, unit, prec); + int index = setTelemetryValue(PROTOCOL_TELEMETRY_LUA, id, subId, instance, + value, unit, prec); if (index >= 0) { TelemetrySensor &telemetrySensor = g_model.telemetrySensors[index]; telemetrySensor.id = id; telemetrySensor.subId = subId; telemetrySensor.instance = instance; - telemetrySensor.init(zname, unit, prec); + telemetrySensor.init(name ? name: name_buf, unit, prec); lua_pushboolean(L, true); - } - else { + } else { lua_pushboolean(L, false); } return 1; diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index feff8e6dd..9737e6704 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -39,9 +39,9 @@ Get current Model information static int luaModelGetInfo(lua_State *L) { lua_newtable(L); - lua_pushtablestring(L, "name", g_model.header.name); + lua_pushtablenstring(L, "name", g_model.header.name); #if LCD_DEPTH > 1 - lua_pushtablestring(L, "bitmap", g_model.header.bitmap); + lua_pushtablenstring(L, "bitmap", g_model.header.bitmap); #endif return 1; } @@ -66,7 +66,7 @@ static int luaModelSetInfo(lua_State *L) const char * key = luaL_checkstring(L, -2); if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); - str2zchar(g_model.header.name, name, sizeof(g_model.header.name)); + strncpy(g_model.header.name, name, sizeof(g_model.header.name)); #if defined(EEPROM) memcpy(modelHeaders[g_eeGeneral.currModel].name, g_model.header.name, sizeof(g_model.header.name)); #endif @@ -258,7 +258,7 @@ static int luaModelGetTimer(lua_State *L) lua_pushtableinteger(L, "countdownBeep", timer.countdownBeep); lua_pushtableboolean(L, "minuteBeep", timer.minuteBeep); lua_pushtableinteger(L, "persistent", timer.persistent); - lua_pushtablestring(L, "name", timer.name); + lua_pushtablenstring(L, "name", timer.name); } else { lua_pushnil(L); @@ -310,7 +310,7 @@ static int luaModelSetTimer(lua_State *L) } if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); - str2zchar(timer.name, name, sizeof(timer.name)); + strncpy(timer.name, name, sizeof(timer.name)); } } storageDirty(EE_MODEL); @@ -424,7 +424,7 @@ static int luaModelGetFlightMode(lua_State * L) if (idx < MAX_FLIGHT_MODES) { FlightModeData * fm = flightModeAddress(idx); lua_newtable(L); - lua_pushtablestring(L, "name", fm->name); + lua_pushtablenstring(L, "name", fm->name); lua_pushtableinteger(L, "switch", fm->swtch); lua_pushtableinteger(L, "fadeIn", fm->fadeIn); lua_pushtableinteger(L, "fadeOut", fm->fadeOut); @@ -477,7 +477,7 @@ static int luaModelSetFlightMode(lua_State * L) const char * key = luaL_checkstring(L, -2); if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); - str2zchar(fm->name, name, sizeof(fm->name)); + strncpy(fm->name, name, sizeof(fm->name)); } else if (!strcmp(key, "switch")) { fm->swtch = luaL_checkinteger(L, -1); @@ -546,8 +546,8 @@ static int luaModelGetInput(lua_State *L) if (idx < count) { ExpoData * expo = expoAddress(first+idx); lua_newtable(L); - lua_pushtablestring(L, "name", expo->name); - lua_pushtablestring(L, "inputName", g_model.inputNames[chn]); + lua_pushtablenstring(L, "name", expo->name); + lua_pushtablenstring(L, "inputName", g_model.inputNames[chn]); lua_pushtableinteger(L, "source", expo->srcRaw); lua_pushtableinteger(L, "weight", expo->weight); lua_pushtableinteger(L, "offset", expo->offset); @@ -599,11 +599,11 @@ static int luaModelInsertInput(lua_State *L) const char * key = luaL_checkstring(L, -2); if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); - str2zchar(expo->name, name, sizeof(expo->name)); + strncpy(expo->name, name, sizeof(expo->name)); } else if (!strcmp(key, "inputName")) { const char * name = luaL_checkstring(L, -1); - str2zchar(g_model.inputNames[chn], name, LEN_INPUT_NAME); + strncpy(g_model.inputNames[chn], name, LEN_INPUT_NAME); } else if (!strcmp(key, "source")) { expo->srcRaw = luaL_checkinteger(L, -1); @@ -773,7 +773,7 @@ static int luaModelGetMix(lua_State *L) if (idx < count) { MixData * mix = mixAddress(first+idx); lua_newtable(L); - lua_pushtablestring(L, "name", mix->name); + lua_pushtablenstring(L, "name", mix->name); lua_pushtableinteger(L, "source", mix->srcRaw); lua_pushtableinteger(L, "weight", mix->weight); lua_pushtableinteger(L, "offset", mix->offset); @@ -827,7 +827,7 @@ static int luaModelInsertMix(lua_State *L) const char * key = luaL_checkstring(L, -2); if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); - str2zchar(mix->name, name, sizeof(mix->name)); + strncpy(mix->name, name, sizeof(mix->name)); } else if (!strcmp(key, "source")) { mix->srcRaw = luaL_checkinteger(L, -1); @@ -1043,7 +1043,7 @@ static int luaModelGetCurve(lua_State *L) if (idx < MAX_CURVES) { CurveHeader & CurveHeader = g_model.curves[idx]; lua_newtable(L); - lua_pushtablestring(L, "name", CurveHeader.name); + lua_pushtablenstring(L, "name", CurveHeader.name); lua_pushtableinteger(L, "type", CurveHeader.type); lua_pushtableboolean(L, "smooth", CurveHeader.smooth); lua_pushtableinteger(L, "points", CurveHeader.points + 5); @@ -1144,7 +1144,7 @@ static int luaModelSetCurve(lua_State *L) const char *key = luaL_checkstring(L, -2); if (!strcmp(key, "name")) { const char *name = luaL_checkstring(L, -1); - str2zchar(newCurveHeader.name, name, sizeof(newCurveHeader.name)); + strncpy(newCurveHeader.name, name, sizeof(newCurveHeader.name)); } else if (!strcmp(key, "type")) { newCurveHeader.type = luaL_checkinteger(L, -1); @@ -1301,7 +1301,7 @@ static int luaModelGetCustomFunction(lua_State *L) lua_pushtableinteger(L, "switch", CFN_SWITCH(cfn)); lua_pushtableinteger(L, "func", CFN_FUNC(cfn)); if (CFN_FUNC(cfn) == FUNC_PLAY_TRACK || CFN_FUNC(cfn) == FUNC_BACKGND_MUSIC || CFN_FUNC(cfn) == FUNC_PLAY_SCRIPT) { - lua_pushtablestring(L, "name", cfn->play.name); + lua_pushtablenstring(L, "name", cfn->play.name); } else { lua_pushtableinteger(L, "value", cfn->all.val); @@ -1398,7 +1398,7 @@ static int luaModelGetOutput(lua_State *L) if (idx < MAX_OUTPUT_CHANNELS) { LimitData * limit = limitAddress(idx); lua_newtable(L); - lua_pushtablestring(L, "name", limit->name); + lua_pushtablenstring(L, "name", limit->name); lua_pushtableinteger(L, "min", limit->min-1000); lua_pushtableinteger(L, "max", limit->max+1000); lua_pushtableinteger(L, "offset", limit->offset); @@ -1440,7 +1440,7 @@ static int luaModelSetOutput(lua_State *L) const char * key = luaL_checkstring(L, -2); if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); - str2zchar(limit->name, name, sizeof(limit->name)); + strncpy(limit->name, name, sizeof(limit->name)); } else if (!strcmp(key, "min")) { limit->min = luaL_checkinteger(L, -1)+1000; @@ -1558,7 +1558,7 @@ static int luaModelGetSensor(lua_State *L) TelemetrySensor & sensor = g_model.telemetrySensors[idx]; lua_newtable(L); lua_pushtableinteger(L, "type", sensor.type); - lua_pushtablestring(L, "name", sensor.label); + lua_pushtablenstring(L, "name", sensor.label); lua_pushtableinteger(L, "unit", sensor.unit); lua_pushtableinteger(L, "prec", sensor.prec); if (sensor.type == TELEM_TYPE_CUSTOM) { diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index f7957e269..89192fb59 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -62,7 +62,20 @@ void luaInitThemesAndWidgets(); #define lua_pushtableboolean(L, k, v) (lua_pushstring(L, (k)), lua_pushboolean(L, (v)), lua_settable(L, -3)) #define lua_pushtableinteger(L, k, v) (lua_pushstring(L, (k)), lua_pushinteger(L, (v)), lua_settable(L, -3)) #define lua_pushtablenumber(L, k, v) (lua_pushstring(L, (k)), lua_pushnumber(L, (v)), lua_settable(L, -3)) + +// size based string (possibly no null-termination) +#define __lua_strncpy(s) \ + char tmp[sizeof(s) + 1]; \ + strncpy(tmp, (s), sizeof(s)); \ + tmp[sizeof(s)] = '\0'; + +// size based string (possibly no null-termination) +#define lua_pushnstring(L, s) { __lua_strncpy(s); lua_pushstring(L, tmp); } +#define lua_pushtablenstring(L, k, v) { __lua_strncpy(s); lua_pushstring(L, (k)); lua_pushstring(L, tmp); lua_settable(L, -3); } + +// null-terminated string #define lua_pushtablestring(L, k, v) (lua_pushstring(L, (k)), lua_pushstring(L, (v)), lua_settable(L, -3)) + #define lua_registerlib(L, name, tab) (luaL_newmetatable(L, name), luaL_setfuncs(L, tab, 0), lua_setglobal(L, name)) #define RUN_MIX_SCRIPT (1 << 0)