Skip to content

Commit

Permalink
Add Lua getUsage() function that returns percent of already used up i… (
Browse files Browse the repository at this point in the history
opentx#5313)

* Add Lua getUsage() function that returns percent of already used up instructions in current script execution cycle. It can be used to avoid script being killed when doing long lasting tasks (like telemetry logs loading and parsing)

* Compilation fixes

* Doc fix

* Disable Lua script instructions limit in DEBUG mode
  • Loading branch information
projectkk2glider authored and kilrah committed Nov 10, 2017
1 parent 6c7e4b5 commit 955d577
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 2 deletions.
16 changes: 16 additions & 0 deletions radio/src/lua/api_general.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1171,6 +1171,21 @@ static int luaLoadScript(lua_State * L)
}
}

/*luadoc
@function getUsage()
Get percent of already used Lua instructions in current script execution cycle.
@retval usage (number) a value from 0 to 100 (percent)
@status current Introduced in 2.2.1
*/
static int luaGetUsage(lua_State * L)
{
lua_pushinteger(L, instructionsPercent);
return 1;
}

const luaL_Reg opentxLib[] = {
{ "getTime", luaGetTime },
{ "getDateTime", luaGetDateTime },
Expand All @@ -1193,6 +1208,7 @@ const luaL_Reg opentxLib[] = {
{ "getRSSI", luaGetRSSI },
{ "killEvents", luaKillEvents },
{ "loadScript", luaLoadScript },
{ "getUsage", luaGetUsage },
#if LCD_DEPTH > 1 && !defined(COLORLCD)
{ "GREY", luaGrey },
#endif
Expand Down
19 changes: 17 additions & 2 deletions radio/src/lua/interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ ScriptInternalData standaloneScript;
uint16_t maxLuaInterval = 0;
uint16_t maxLuaDuration = 0;
bool luaLcdAllowed;
int instructionsPercent = 0;
uint8_t instructionsPercent = 0;
char lua_warning_info[LUA_WARNING_INFO_LEN+1];
struct our_longjmp * global_lj = 0;
#if defined(COLORLCD)
Expand All @@ -65,17 +65,32 @@ int custom_lua_atpanic(lua_State * L)
void luaHook(lua_State * L, lua_Debug *ar)
{
instructionsPercent++;
#if defined(DEBUG)
// Disable Lua script instructions limit in DEBUG mode,
// just report max value reached
static uint16_t max = 0;
if (instructionsPercent > 100) {
if (max + 10 < instructionsPercent) {
max = instructionsPercent;
TRACE("LUA instructionsPercent %u%%", (uint32_t)max);
}
}
else if (instructionsPercent < 10) {
max = 0;
}
#else
if (instructionsPercent > 100) {
// From now on, as soon as a line is executed, error
// keep erroring until you're script reaches the top
lua_sethook(L, luaHook, LUA_MASKLINE, 0);
luaL_error(L, "CPU limit");
}
#endif
}

void luaSetInstructionsLimit(lua_State * L, int count)
{
instructionsPercent=0;
instructionsPercent = 0;
lua_sethook(L, luaHook, LUA_MASKCOUNT, count);
}

Expand Down
1 change: 1 addition & 0 deletions radio/src/lua/lua_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ extern struct our_longjmp * global_lj;

extern uint16_t maxLuaInterval;
extern uint16_t maxLuaDuration;
extern uint8_t instructionsPercent;

#if defined(PCBTARANIS)
#define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER && ((luaState & INTERPRETER_RUNNING_STANDALONE_SCRIPT) || (key) != KEY_PAGE))
Expand Down

0 comments on commit 955d577

Please sign in to comment.