From bbd71be011ea51f8eef16cb664a0e06e14992e18 Mon Sep 17 00:00:00 2001 From: rotorman Date: Fri, 18 Jun 2021 20:52:29 +0200 Subject: [PATCH 01/18] Added background to splash, matching the bootloader. --- radio/src/bitmaps/480x272/CMakeLists.txt | 2 +- radio/src/bitmaps/480x272/splash.png | Bin 151939 -> 49035 bytes radio/src/gui/colorlcd/splash.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/bitmaps/480x272/CMakeLists.txt b/radio/src/bitmaps/480x272/CMakeLists.txt index 32e10bb5f..100143cce 100644 --- a/radio/src/bitmaps/480x272/CMakeLists.txt +++ b/radio/src/bitmaps/480x272/CMakeLists.txt @@ -20,7 +20,7 @@ set(BITMAP_RLE_ARGS ${BITMAP_ARGS} --rle) set(MASK_RLE_ARGS ${MASK_ARGS} --rle) add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bitmaps "${RADIO_SRC_DIR}/bitmaps/480x272/bmp_*.png" "5/6/5" "${BITMAP_ARGS}") -add_png_target(${BITMAP_TARGET_PREFIX}_splash "${RADIO_SRC_DIR}/bitmaps/480x272/big_logo.png") +add_png_target(${BITMAP_TARGET_PREFIX}_splash "${RADIO_SRC_DIR}/bitmaps/480x272/splash.png") add_bitmaps_target(${BITMAP_TARGET_PREFIX}_calibration_bitmaps "${RADIO_SRC_DIR}/bitmaps/480x272/calibration/bmp_*.png" "5/6/5" "${BITMAP_ARGS}") add_bitmaps_target(${BITMAP_TARGET_PREFIX}_button_bitmaps "${RADIO_SRC_DIR}/bitmaps/480x272/button/alpha_*.png" "4/4/4/4" "${BITMAP_ARGS}") diff --git a/radio/src/bitmaps/480x272/splash.png b/radio/src/bitmaps/480x272/splash.png index c258f9ae444e5c74c254bb64424399cadf1fcab6..c61d211e993bca5abf98829ff7a4aa7f374500e5 100644 GIT binary patch literal 49035 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 literal 151939 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 z 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¥LrM%`q{?$ns%=OLK|%#$=X70KW8)+XWEK=l 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 AU;qFB diff --git a/radio/src/gui/colorlcd/splash.cpp b/radio/src/gui/colorlcd/splash.cpp index 4c035b5d0..706f3ea7c 100644 --- a/radio/src/gui/colorlcd/splash.cpp +++ b/radio/src/gui/colorlcd/splash.cpp @@ -23,7 +23,7 @@ #if defined(SPLASH) const uint8_t __bmp_splash[] { -#include "big_logo.lbm" +#include "splash.lbm" }; void drawSplash() From 2e129af9f194e41244efa4be15407f907a6c6b7a Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Mon, 19 Jul 2021 09:20:10 -0400 Subject: [PATCH 02/18] Added VCENTER to lcd flags Only for COLORLCD --- radio/src/lua/api_colorlcd.cpp | 5 ++++- radio/src/lua/api_general.cpp | 1 + radio/src/lua/widgets.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/radio/src/lua/api_colorlcd.cpp b/radio/src/lua/api_colorlcd.cpp index cff137481..6381f04ed 100644 --- a/radio/src/lua/api_colorlcd.cpp +++ b/radio/src/lua/api_colorlcd.cpp @@ -47,7 +47,10 @@ static int8_t getTextVerticalOffset(LcdFlags flags) if (font_index >= sizeof(text_vertical_offset)) { return 0; } - return text_vertical_offset[font_index]; + int vcenter = 0; + if (flags & VCENTERED) + vcenter = 0.5 * getFontHeight(flags & 0xFFFF); + return text_vertical_offset[font_index] - vcenter; } /*luadoc diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9cd4db639..b15f437e0 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1860,6 +1860,7 @@ const luaR_value_entry opentxConstants[] = { #endif #if defined(COLORLCD) { "BOLD", FONT(BOLD) }, + { "VCENTER", VCENTERED }, #else { "BOLD", BOLD }, #endif diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index a5d3dae8b..0b1d90c66 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -360,7 +360,7 @@ void LuaWidget::background() { if (lsWidgets == 0 || errorMessage) return; - TRACE("LuaWidget::background()"); + // TRACE("LuaWidget::background()"); luaSetInstructionsLimit(lsWidgets, WIDGET_SCRIPTS_MAX_INSTRUCTIONS); LuaWidgetFactory * factory = (LuaWidgetFactory *)this->factory; if (factory->backgroundFunction) { From e3fb2ac6ea02e6216deab6782f0a45185e692530 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Thu, 22 Jul 2021 08:01:08 -0400 Subject: [PATCH 03/18] Added key event to fullscreen Lua widget --- radio/src/lua/widgets.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index a5d3dae8b..9361cc6bc 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -341,15 +341,22 @@ void LuaWidget::refresh(BitmapBuffer* dc) LuaWidgetFactory * factory = (LuaWidgetFactory *)this->factory; lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, factory->refreshFunction); lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, luaWidgetDataRef); + + // Pass key event to fullscreen Lua widget + if (fullscreen) { + event_t event = getWindowEvent(); + lua_pushinteger(lsWidgets, event); + } else + lua_pushnil(lsWidgets); // Enable drawing into the current LCD buffer luaLcdBuffer = dc; luaLcdAllowed = true; - if (lua_pcall(lsWidgets, 1, 0, 0) != 0) { + + if (lua_pcall(lsWidgets, 2, 0, 0) != 0) { setErrorMessage("refresh()"); } // Remove LCD - luaLcdAllowed = false; luaLcdBuffer = nullptr; // mark as refreshed From e1066af88cb36215f321d472c11880862209a56a Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Mon, 5 Jul 2021 02:32:44 -0400 Subject: [PATCH 04/18] Added LuaWidget::onEvent(event) and LuaWidget::event to capture key events to be passed to the Lua widgets. --- radio/src/lua/widgets.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 9361cc6bc..50fcbb034 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -190,6 +190,7 @@ class LuaWidget: public Widget const char * getErrorMessage() const override; void update() override; void background() override; + void onEvent(event_t event) override; // Calls LUA widget 'refresh' method void refresh(BitmapBuffer* dc) override; @@ -199,6 +200,7 @@ class LuaWidget: public Widget char * errorMessage; uint32_t lastRefresh = 0; bool refreshed = false; + event_t event = 0; void checkEvents() override; void setErrorMessage(const char * funcName); @@ -344,7 +346,8 @@ void LuaWidget::refresh(BitmapBuffer* dc) // Pass key event to fullscreen Lua widget if (fullscreen) { - event_t event = getWindowEvent(); + event_t event = this->event; + this->event = 0; lua_pushinteger(lsWidgets, event); } else lua_pushnil(lsWidgets); @@ -379,6 +382,18 @@ void LuaWidget::background() } } +void LuaWidget::onEvent(event_t event) +{ +#if defined(HARDWARE_KEYS) + if (fullscreen && EVT_KEY_LONG(KEY_EXIT) != event) + this->event = event; + else + this->event = 0; + + Widget::onEvent(event); +#endif +} + void luaLoadWidgetCallback() { TRACE("luaLoadWidgetCallback()"); From 0b9fd82074b23e81308231b2fa1f38b430b70bb6 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Sat, 10 Jul 2021 23:34:11 -0400 Subject: [PATCH 05/18] Added touch events to Lua widgets --- radio/src/gui/colorlcd/widget.cpp | 4 +- radio/src/gui/colorlcd/widget.h | 5 +- radio/src/keys.h | 12 +++ radio/src/lua/api_general.cpp | 7 ++ radio/src/lua/widgets.cpp | 152 ++++++++++++++++++++++++++++-- 5 files changed, 166 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/colorlcd/widget.cpp b/radio/src/gui/colorlcd/widget.cpp index 350762fd8..fdf41062d 100644 --- a/radio/src/gui/colorlcd/widget.cpp +++ b/radio/src/gui/colorlcd/widget.cpp @@ -125,9 +125,9 @@ void Widget::paint(BitmapBuffer * dc) } } +#if defined(HARDWARE_KEYS) void Widget::onEvent(event_t event) { -#if defined(HARDWARE_KEYS) TRACE("### event = 0x%x ###", event); if (!fullscreen) { if (event == EVT_KEY_BREAK(KEY_EXIT)) { @@ -145,8 +145,8 @@ void Widget::onEvent(event_t event) killEvents(event); setFullscreen(false); } -#endif } +#endif void Widget::update() { diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 7906e1a61..eb76acba5 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -83,11 +83,12 @@ class Widget : public Button // Window interface void checkEvents() override; +#if defined(HARDWARE_KEYS) void onEvent(event_t event) override; +#endif #if defined(HARDWARE_TOUCH) bool onTouchEnd(coord_t x, coord_t y) override; - bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, - coord_t slideX, coord_t slideY) override; + bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override; #endif void paint(BitmapBuffer * dc) override; diff --git a/radio/src/keys.h b/radio/src/keys.h index f8d30f1e5..601b0a30f 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -72,6 +72,18 @@ constexpr bool IS_VIRTUAL_KEY_EVENT(event_t event) { return (event & 0xF000) == _MSK_VIRTUAL_KEY; } + +// Touch events for Lua widgets - assuming _MSK_KEY_* for PCBHORUS +constexpr event_t EVT_TOUCH = EVT_VIRTUAL_KEY('t'); +constexpr event_t EVT_TOUCH_FIRST = EVT_TOUCH | _MSK_KEY_FIRST; +constexpr event_t EVT_TOUCH_BREAK = EVT_TOUCH | _MSK_KEY_BREAK; +constexpr event_t EVT_TOUCH_SLIDE = EVT_TOUCH | _MSK_KEY_LONG; +constexpr event_t EVT_TOUCH_TAP = EVT_TOUCH | _MSK_KEY_REPT; + +constexpr bool IS_TOUCH_EVENT(event_t event) +{ + return (event & ~_MSK_KEY_FLAGS) == EVT_TOUCH; +} #endif // normal order of events is: FIRST, LONG, REPEAT, REPEAT, ..., BREAK diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9cd4db639..65322ae05 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -2097,6 +2097,13 @@ const luaR_value_entry opentxConstants[] = { { "EVT_ROT_RIGHT", EVT_ROTARY_RIGHT }, #endif +#if defined(HARDWARE_TOUCH) + { "EVT_TOUCH_FIRST", EVT_TOUCH_FIRST }, + { "EVT_TOUCH_BREAK", EVT_TOUCH_BREAK }, + { "EVT_TOUCH_SLIDE", EVT_TOUCH_SLIDE }, + { "EVT_TOUCH_TAP", EVT_TOUCH_TAP }, +#endif + #if LCD_DEPTH > 1 && !defined(COLORLCD) { "FILL_WHITE", FILL_WHITE }, { "GREY_DEFAULT", GREY_DEFAULT }, diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 50fcbb034..e2a514bff 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -31,6 +31,12 @@ #define MANUAL_SCRIPTS_MAX_INSTRUCTIONS (20000/100) #define LUA_WARNING_INFO_LEN 64 +#if defined(HARDWARE_TOUCH) +#define EVT_TOUCH_TAP_TIME 25 +#define EVT_TOUCH_SWIPE_LOCK 10 +#define EVT_TOUCH_SWIPE_SPEED 35 +#endif + constexpr int LUA_WIDGET_REFRESH = 1000 / 10; // 10 Hz lua_State * lsWidgets = NULL; @@ -190,7 +196,16 @@ class LuaWidget: public Widget const char * getErrorMessage() const override; void update() override; void background() override; + +#if defined(HARDWARE_KEYS) void onEvent(event_t event) override; +#endif + +#if defined(HARDWARE_TOUCH) + bool onTouchStart(coord_t x, coord_t y) override; + bool onTouchEnd(coord_t x, coord_t y) override; + bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override; +#endif // Calls LUA widget 'refresh' method void refresh(BitmapBuffer* dc) override; @@ -200,12 +215,34 @@ class LuaWidget: public Widget char * errorMessage; uint32_t lastRefresh = 0; bool refreshed = false; - event_t event = 0; + + static event_t event; +#if defined(HARDWARE_TOUCH) + static coord_t touchX; + static coord_t touchY; + static coord_t startX; + static coord_t startY; + static coord_t slideX; + static coord_t slideY; + static tmr10ms_t lastTouchDown; +#endif void checkEvents() override; void setErrorMessage(const char * funcName); }; +event_t LuaWidget::event = 0; + +#if defined(HARDWARE_TOUCH) +coord_t LuaWidget::touchX = 0; +coord_t LuaWidget::touchY = 0; +coord_t LuaWidget::startX = 0; +coord_t LuaWidget::startY = 0; +coord_t LuaWidget::slideX = 0; +coord_t LuaWidget::slideY = 0; +tmr10ms_t LuaWidget::lastTouchDown = 0; +#endif + void l_pushtableint(const char * key, int value) { lua_pushstring(lsWidgets, key); @@ -213,6 +250,13 @@ void l_pushtableint(const char * key, int value) lua_settable(lsWidgets, -3); } +void l_pushtablebool(const char * key, bool value) +{ + lua_pushstring(lsWidgets, key); + lua_pushboolean(lsWidgets, value); + lua_settable(lsWidgets, -3); +} + class LuaWidgetFactory: public WidgetFactory { friend void luaLoadWidgetCallback(); @@ -345,18 +389,47 @@ void LuaWidget::refresh(BitmapBuffer* dc) lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, luaWidgetDataRef); // Pass key event to fullscreen Lua widget - if (fullscreen) { - event_t event = this->event; - this->event = 0; + if (fullscreen) lua_pushinteger(lsWidgets, event); - } else + else lua_pushnil(lsWidgets); +#if defined(HARDWARE_TOUCH) + if (fullscreen && IS_TOUCH_EVENT(event)) { + lua_newtable(lsWidgets); + l_pushtableint("x", touchX); + l_pushtableint("y", touchY); + + if (LuaWidget::event == EVT_TOUCH_SLIDE) { + l_pushtableint("startX", startX); + l_pushtableint("startY", startY); + l_pushtableint("slideX", slideX); + l_pushtableint("slideY", slideY); + + if (slideY > -EVT_TOUCH_SWIPE_LOCK && slideY < EVT_TOUCH_SWIPE_LOCK) { + if (slideX > EVT_TOUCH_SWIPE_SPEED) + l_pushtablebool("swipeRight", true); + else if (slideX < -EVT_TOUCH_SWIPE_SPEED) + l_pushtablebool("swipeLeft", true); + } + else if (slideX > -EVT_TOUCH_SWIPE_LOCK && slideX < EVT_TOUCH_SWIPE_LOCK) { + if (slideY > EVT_TOUCH_SWIPE_SPEED) + l_pushtablebool("swipeDown", true); + else if (slideY < -EVT_TOUCH_SWIPE_SPEED) + l_pushtablebool("swipeUp", true); + } + } + } else +#endif + lua_pushnil(lsWidgets); + + event = 0; + // Enable drawing into the current LCD buffer luaLcdBuffer = dc; luaLcdAllowed = true; - if (lua_pcall(lsWidgets, 2, 0, 0) != 0) { + if (lua_pcall(lsWidgets, 3, 0, 0) != 0) { setErrorMessage("refresh()"); } // Remove LCD @@ -382,17 +455,76 @@ void LuaWidget::background() } } +#if defined(HARDWARE_KEYS) void LuaWidget::onEvent(event_t event) { -#if defined(HARDWARE_KEYS) if (fullscreen && EVT_KEY_LONG(KEY_EXIT) != event) - this->event = event; + LuaWidget::event = event; else - this->event = 0; + LuaWidget::event = 0; Widget::onEvent(event); -#endif } +#endif + +#if defined(HARDWARE_TOUCH) +bool LuaWidget::onTouchStart(coord_t x, coord_t y) +{ + TRACE_WINDOWS("LuaWidget received touch start (%d) x=%d;y=%d", hasFocus(), x, y); + + if (fullscreen) { + event = EVT_TOUCH_FIRST; + touchX = x; + touchY = y; + + if (lastTouchDown == 0) + lastTouchDown = get_tmr10ms(); + + return true; + } + + return Widget::onTouchStart(x, y); +} + +bool LuaWidget::onTouchEnd(coord_t x, coord_t y) +{ + TRACE_WINDOWS("LuaWidget received touch end (%d) x=%d;y=%d", hasFocus(), x, y); + + if (fullscreen) { + if (get_tmr10ms() - lastTouchDown <= EVT_TOUCH_TAP_TIME) + event = EVT_TOUCH_TAP; + else + event = EVT_TOUCH_BREAK; + + touchX = x; + touchY = y; + lastTouchDown = 0; + + return true; + } + + return Widget::onTouchEnd(x, y); +} + +bool LuaWidget::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) +{ + TRACE_WINDOWS("LuaWidget touch slide"); + if (fullscreen) { + event = EVT_TOUCH_SLIDE; + touchX = x; + touchY = y; + LuaWidget::startX = startX; + LuaWidget::startY = startY; + LuaWidget::slideX = slideX; + LuaWidget::slideY = slideY; + lastTouchDown = 0; + + return true; + } + + return Widget::onTouchSlide(x, y, startX, startY, slideX, slideY); +} +#endif void luaLoadWidgetCallback() { From 8b90754e9509fb458429a014a0db8ae1a49de1bf Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Sun, 11 Jul 2021 06:27:20 -0400 Subject: [PATCH 06/18] Only one EVT_TOUCH_FIRST at a time --- radio/src/lua/widgets.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index e2a514bff..dc02e1a8e 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -472,13 +472,14 @@ bool LuaWidget::onTouchStart(coord_t x, coord_t y) { TRACE_WINDOWS("LuaWidget received touch start (%d) x=%d;y=%d", hasFocus(), x, y); + // Only one EVT_TOUCH_FIRST at a time, and also start timer for possible TAP if (fullscreen) { - event = EVT_TOUCH_FIRST; - touchX = x; - touchY = y; - - if (lastTouchDown == 0) + if (lastTouchDown == 0) { + event = EVT_TOUCH_FIRST; + touchX = x; + touchY = y; lastTouchDown = get_tmr10ms(); + } return true; } From 61602d525b7a8b52f7a58a0fc98c0cb994795d26 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Sun, 11 Jul 2021 14:49:17 -0400 Subject: [PATCH 07/18] Improved swipe-onomics --- radio/src/lua/widgets.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index dc02e1a8e..0abba222a 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -32,8 +32,8 @@ #define LUA_WARNING_INFO_LEN 64 #if defined(HARDWARE_TOUCH) -#define EVT_TOUCH_TAP_TIME 25 -#define EVT_TOUCH_SWIPE_LOCK 10 +#define EVT_TOUCH_TAP_TIME 25 +#define EVT_TOUCH_SWIPE_LOCK 4 #define EVT_TOUCH_SWIPE_SPEED 35 #endif @@ -406,13 +406,16 @@ void LuaWidget::refresh(BitmapBuffer* dc) l_pushtableint("slideX", slideX); l_pushtableint("slideY", slideY); - if (slideY > -EVT_TOUCH_SWIPE_LOCK && slideY < EVT_TOUCH_SWIPE_LOCK) { + coord_t absX = (slideX < 0) ? -slideX : slideX; + coord_t absY = (slideY < 0) ? -slideY : slideY; + + if (absX > EVT_TOUCH_SWIPE_LOCK * absY) { if (slideX > EVT_TOUCH_SWIPE_SPEED) l_pushtablebool("swipeRight", true); else if (slideX < -EVT_TOUCH_SWIPE_SPEED) l_pushtablebool("swipeLeft", true); } - else if (slideX > -EVT_TOUCH_SWIPE_LOCK && slideX < EVT_TOUCH_SWIPE_LOCK) { + else if (absY > EVT_TOUCH_SWIPE_LOCK * absX) { if (slideY > EVT_TOUCH_SWIPE_SPEED) l_pushtablebool("swipeDown", true); else if (slideY < -EVT_TOUCH_SWIPE_SPEED) From fd05bcab1996fb60d15e52daf300919d3d5d726e Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Mon, 12 Jul 2021 15:33:12 -0400 Subject: [PATCH 08/18] One swipe at a time Added a timeout so we do not get a swipe storm during slide events --- radio/src/lua/widgets.cpp | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 0abba222a..105ab320e 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -32,9 +32,10 @@ #define LUA_WARNING_INFO_LEN 64 #if defined(HARDWARE_TOUCH) -#define EVT_TOUCH_TAP_TIME 25 -#define EVT_TOUCH_SWIPE_LOCK 4 -#define EVT_TOUCH_SWIPE_SPEED 35 +#define EVT_TOUCH_TAP_TIME 25 +#define EVT_TOUCH_SWIPE_LOCK 4 +#define EVT_TOUCH_SWIPE_SPEED 35 +#define EVT_TOUCH_SWIPE_TIMEOUT 50 #endif constexpr int LUA_WIDGET_REFRESH = 1000 / 10; // 10 Hz @@ -226,6 +227,7 @@ class LuaWidget: public Widget static coord_t slideX; static coord_t slideY; static tmr10ms_t lastTouchDown; + static tmr10ms_t swipeTimeOut; #endif void checkEvents() override; void setErrorMessage(const char * funcName); @@ -241,6 +243,7 @@ coord_t LuaWidget::startY = 0; coord_t LuaWidget::slideX = 0; coord_t LuaWidget::slideY = 0; tmr10ms_t LuaWidget::lastTouchDown = 0; +tmr10ms_t LuaWidget::swipeTimeOut = 0; #endif void l_pushtableint(const char * key, int value) @@ -409,17 +412,25 @@ void LuaWidget::refresh(BitmapBuffer* dc) coord_t absX = (slideX < 0) ? -slideX : slideX; coord_t absY = (slideY < 0) ? -slideY : slideY; - if (absX > EVT_TOUCH_SWIPE_LOCK * absY) { - if (slideX > EVT_TOUCH_SWIPE_SPEED) - l_pushtablebool("swipeRight", true); - else if (slideX < -EVT_TOUCH_SWIPE_SPEED) - l_pushtablebool("swipeLeft", true); - } - else if (absY > EVT_TOUCH_SWIPE_LOCK * absX) { - if (slideY > EVT_TOUCH_SWIPE_SPEED) - l_pushtablebool("swipeDown", true); - else if (slideY < -EVT_TOUCH_SWIPE_SPEED) - l_pushtablebool("swipeUp", true); + if (get_tmr10ms() > swipeTimeOut) { + if (absX > EVT_TOUCH_SWIPE_LOCK * absY) { + if (slideX > EVT_TOUCH_SWIPE_SPEED) { + l_pushtablebool("swipeRight", true); + swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; + } else if (slideX < -EVT_TOUCH_SWIPE_SPEED) { + l_pushtablebool("swipeLeft", true); + swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; + } + } + else if (absY > EVT_TOUCH_SWIPE_LOCK * absX) { + if (slideY > EVT_TOUCH_SWIPE_SPEED) { + l_pushtablebool("swipeDown", true); + swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; + } else if (slideY < -EVT_TOUCH_SWIPE_SPEED) { + l_pushtablebool("swipeUp", true); + swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; + } + } } } } else From 296acc65589d8545a0f9e26642ec582da3cfaa52 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Tue, 13 Jul 2021 16:41:44 -0400 Subject: [PATCH 09/18] Code polishing --- radio/src/lua/widgets.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 105ab320e..9483bc16a 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -409,28 +409,27 @@ void LuaWidget::refresh(BitmapBuffer* dc) l_pushtableint("slideX", slideX); l_pushtableint("slideY", slideY); - coord_t absX = (slideX < 0) ? -slideX : slideX; - coord_t absY = (slideY < 0) ? -slideY : slideY; - + // Do we have a swipe? Only one at a time! if (get_tmr10ms() > swipeTimeOut) { + coord_t absX = (slideX < 0) ? -slideX : slideX; + coord_t absY = (slideY < 0) ? -slideY : slideY; + bool swiped = false; + if (absX > EVT_TOUCH_SWIPE_LOCK * absY) { - if (slideX > EVT_TOUCH_SWIPE_SPEED) { + if ((swiped = (slideX > EVT_TOUCH_SWIPE_SPEED))) l_pushtablebool("swipeRight", true); - swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; - } else if (slideX < -EVT_TOUCH_SWIPE_SPEED) { + else if ((swiped = (slideX < -EVT_TOUCH_SWIPE_SPEED))) l_pushtablebool("swipeLeft", true); - swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; - } } else if (absY > EVT_TOUCH_SWIPE_LOCK * absX) { - if (slideY > EVT_TOUCH_SWIPE_SPEED) { + if ((swiped = (slideY > EVT_TOUCH_SWIPE_SPEED))) l_pushtablebool("swipeDown", true); - swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; - } else if (slideY < -EVT_TOUCH_SWIPE_SPEED) { + else if ((swiped = (slideY < -EVT_TOUCH_SWIPE_SPEED))) l_pushtablebool("swipeUp", true); - swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; - } } + + if (swiped) + swipeTimeOut = get_tmr10ms() + EVT_TOUCH_SWIPE_TIMEOUT; } } } else From c62aac7bded492a91543d1d9bf5a15f50ddb93c8 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Sun, 20 Jun 2021 15:52:16 -0400 Subject: [PATCH 10/18] Lua task preempts long running scripts instead of killing them Ported to EdgeTX from https://github.com/opentx/opentx/pull/8194 --- radio/src/gui/128x64/model_custom_scripts.cpp | 3 - radio/src/gui/128x64/view_telemetry.cpp | 1 - radio/src/gui/212x64/model_custom_scripts.cpp | 3 - radio/src/gui/212x64/view_telemetry.cpp | 1 - radio/src/lua/api_general.cpp | 7 +- radio/src/lua/interface.cpp | 981 ++++++++++-------- radio/src/lua/lua_api.h | 61 +- radio/src/lua/widgets.cpp | 57 +- radio/src/main.cpp | 33 +- 9 files changed, 640 insertions(+), 507 deletions(-) diff --git a/radio/src/gui/128x64/model_custom_scripts.cpp b/radio/src/gui/128x64/model_custom_scripts.cpp index 8bb90859a..a09b5ec37 100644 --- a/radio/src/gui/128x64/model_custom_scripts.cpp +++ b/radio/src/gui/128x64/model_custom_scripts.cpp @@ -157,9 +157,6 @@ void menuModelCustomScripts(event_t event) case SCRIPT_SYNTAX_ERROR: lcdDrawText(30*FW+2, y, "(error)"); break; - case SCRIPT_KILLED: - lcdDrawText(29*FW+2, y, "(killed)"); - break; default: lcdDrawNumber(34*FW, y, luaGetCpuUsed(scriptIndex), RIGHT); lcdDrawChar(34*FW, y, '%'); diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp index 3b6835f64..a3d6afee0 100644 --- a/radio/src/gui/128x64/view_telemetry.cpp +++ b/radio/src/gui/128x64/view_telemetry.cpp @@ -177,7 +177,6 @@ bool displayTelemetryScreen() return false; // requested lua telemetry screen not available case SCRIPT_SYNTAX_ERROR: case SCRIPT_PANIC: - case SCRIPT_KILLED: luaError(lsScripts, state, false); return true; } diff --git a/radio/src/gui/212x64/model_custom_scripts.cpp b/radio/src/gui/212x64/model_custom_scripts.cpp index 12b904e04..d79ae9f88 100644 --- a/radio/src/gui/212x64/model_custom_scripts.cpp +++ b/radio/src/gui/212x64/model_custom_scripts.cpp @@ -150,9 +150,6 @@ void menuModelCustomScripts(event_t event) case SCRIPT_SYNTAX_ERROR: lcdDrawText(30*FW+2, y, "(error)"); break; - case SCRIPT_KILLED: - lcdDrawText(29*FW+2, y, "(killed)"); - break; default: lcdDrawNumber(34*FW, y, luaGetCpuUsed(scriptIndex), RIGHT); lcdDrawChar(34*FW, y, '%'); diff --git a/radio/src/gui/212x64/view_telemetry.cpp b/radio/src/gui/212x64/view_telemetry.cpp index e15fc5781..2fe96d768 100644 --- a/radio/src/gui/212x64/view_telemetry.cpp +++ b/radio/src/gui/212x64/view_telemetry.cpp @@ -179,7 +179,6 @@ bool displayTelemetryScreen() return false; // requested lua telemetry screen not available case SCRIPT_SYNTAX_ERROR: case SCRIPT_PANIC: - case SCRIPT_KILLED: luaError(lsScripts, state, false); return true; } diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9cd4db639..d324cdced 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1081,12 +1081,13 @@ Stops key state machine. See [Key Events](../key_events.md) for the detailed des */ static int luaKillEvents(lua_State * L) { - uint8_t key = EVT_KEY_MASK(luaL_checkinteger(L, 1)); + event_t key = EVT_KEY_MASK(luaL_checkinteger(L, 1)); // prevent killing maskable keys (only in telemetry scripts) - // TODO add which tpye of script is running before p_call() + // TODO add which type of script is running before lua_resume() if (IS_MASKABLE(key)) { killEvents(key); - } + luaEmptyEventBuffer(); + } return 0; } diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 755c67150..d7b56f140 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -39,20 +39,25 @@ extern "C" { #include } -#define PERMANENT_SCRIPTS_MAX_INSTRUCTIONS (10000/100) -#define MANUAL_SCRIPTS_MAX_INSTRUCTIONS (20000/100) -#define LUA_WARNING_INFO_LEN 64 +#define PERMANENT_SCRIPTS_MAX_INSTRUCTIONS 100 +#define LUA_WARNING_INFO_LEN 64 +#define LUA_TASK_PERIOD_TICKS 5 // 50 ms +// Since we may not run FG every time, keep the first two events in a buffer +event_t events[2] = {0, 0}; +// The main thread - lsScripts is now a coroutine +lua_State * L = nullptr; lua_State *lsScripts = nullptr; uint8_t luaState = 0; uint8_t luaScriptsCount = 0; bool luaLcdAllowed = false; ScriptInternalData scriptInternalData[MAX_SCRIPTS]; ScriptInputsOutputs scriptInputsOutputs[MAX_SCRIPTS]; -ScriptInternalData standaloneScript; + uint16_t maxLuaInterval = 0; uint16_t maxLuaDuration = 0; uint8_t instructionsPercent = 0; +tmr10ms_t luaCycleStart; char lua_warning_info[LUA_WARNING_INFO_LEN+1]; struct our_longjmp * global_lj = 0; #if defined(COLORLCD) @@ -95,7 +100,7 @@ void *tracer_alloc(void * ud, void * ptr, size_t osize, size_t nsize) /* custom panic handler */ int custom_lua_atpanic(lua_State * L) { - TRACE("PANIC: unprotected error in call to Lua API (%s)", lua_tostring(L, -1)); + TRACE_ERROR("PANIC: unprotected error in call to Lua API (%s)\n", lua_tostring(L, -1)); if (global_lj) { longjmp(global_lj->b, 1); /* will never return */ @@ -103,32 +108,13 @@ int custom_lua_atpanic(lua_State * L) return 0; } -void luaHook(lua_State * L, lua_Debug *ar) +static void luaHook(lua_State * L, lua_Debug *ar) { if (ar->event == LUA_HOOKCOUNT) { - 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); + if (get_tmr10ms() - luaCycleStart >= LUA_TASK_PERIOD_TICKS) { + lua_yield(lsScripts, 0); } } - 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 - } #if defined(LUA_ALLOCATOR_TRACER) else if (ar->event == LUA_HOOKLINE) { lua_getinfo(L, "nSl", ar); @@ -144,6 +130,12 @@ void luaHook(lua_State * L, lua_Debug *ar) #endif // #if defined(LUA_ALLOCATOR_TRACER) } +void luaEmptyEventBuffer() +{ + events[0] = 0; + events[1] = 0; +} + void luaSetInstructionsLimit(lua_State * L, int count) { instructionsPercent = 0; @@ -154,31 +146,34 @@ void luaSetInstructionsLimit(lua_State * L, int count) #endif } -int luaGetInputs(lua_State * L, ScriptInputsOutputs & sid) +int luaGetInputs(lua_State * L2, ScriptInputsOutputs & sid) { - if (!lua_istable(L, -1)) + if (!lua_istable(L2, -1)) return -1; memclear(sid.inputs, sizeof(sid.inputs)); sid.inputsCount = 0; - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - luaL_checktype(L, -2, LUA_TNUMBER); // key is number - luaL_checktype(L, -1, LUA_TTABLE); // value is table + for (lua_pushnil(L2); lua_next(L2, -2); lua_pop(L2, 1)) { + luaL_checktype(L2, -2, LUA_TNUMBER); // key is number + luaL_checktype(L2, -1, LUA_TTABLE); // value is table if (sid.inputsCountname = lua_tostring(L, -1); + luaL_checktype(L2, -2, LUA_TNUMBER); // key is number + luaL_checktype(L2, -1, LUA_TSTRING); // value is string + lua_xmove(lsScripts, L, 1); // To preserve the string value, move it to the main stack + lua_pushnil(lsScripts); // Keep the stack balanced + lua_insert(L, -2); // Keep the coroutine at the top of the main stack + si->name = lua_tostring(L, -2); break; case 1: - luaL_checktype(L, -2, LUA_TNUMBER); // key is number - luaL_checktype(L, -1, LUA_TNUMBER); // value is number - type = lua_tointeger(L, -1); + luaL_checktype(L2, -2, LUA_TNUMBER); // key is number + luaL_checktype(L2, -1, LUA_TNUMBER); // value is number + type = lua_tointeger(L2, -1); if (type >= INPUT_TYPE_FIRST && type <= INPUT_TYPE_LAST) { si->type = type; } @@ -191,24 +186,24 @@ int luaGetInputs(lua_State * L, ScriptInputsOutputs & sid) } break; case 2: - luaL_checktype(L, -2, LUA_TNUMBER); // key is number - luaL_checktype(L, -1, LUA_TNUMBER); // value is number + luaL_checktype(L2, -2, LUA_TNUMBER); // key is number + luaL_checktype(L2, -1, LUA_TNUMBER); // value is number if (si->type == INPUT_TYPE_VALUE) { - si->min = lua_tointeger(L, -1); + si->min = lua_tointeger(L2, -1); } break; case 3: - luaL_checktype(L, -2, LUA_TNUMBER); // key is number - luaL_checktype(L, -1, LUA_TNUMBER); // value is number + luaL_checktype(L2, -2, LUA_TNUMBER); // key is number + luaL_checktype(L2, -1, LUA_TNUMBER); // value is number if (si->type == INPUT_TYPE_VALUE) { - si->max = lua_tointeger(L, -1); + si->max = lua_tointeger(L2, -1); } break; case 4: - luaL_checktype(L, -2, LUA_TNUMBER); // key is number - luaL_checktype(L, -1, LUA_TNUMBER); // value is number + luaL_checktype(L2, -2, LUA_TNUMBER); // key is number + luaL_checktype(L2, -1, LUA_TNUMBER); // value is number if (si->type == INPUT_TYPE_VALUE) { - si->def = lua_tointeger(L, -1); + si->def = lua_tointeger(L2, -1); } break; } @@ -220,18 +215,21 @@ int luaGetInputs(lua_State * L, ScriptInputsOutputs & sid) return 0; } -int luaGetOutputs(lua_State * L, ScriptInputsOutputs & sid) +int luaGetOutputs(lua_State * L2, ScriptInputsOutputs & sid) { - if (!lua_istable(L, -1)) + if (!lua_istable(L2, -1)) return -1; sid.outputsCount = 0; - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - luaL_checktype(L, -2, LUA_TNUMBER); // key is number - luaL_checktype(L, -1, LUA_TSTRING); // value is string - if (sid.outputsCountfdate/ftime @@ -380,14 +376,10 @@ static void luaDumpState(lua_State * L, const char * filename, const FILINFO * f /** @fn luaLoadScriptFileToState(lua_State * L, const char * filename, const char * mode) - Load a Lua script file into a given lua_State (stack). May use OpenTx's optional pre-compilation feature to save memory and time during load. - @param L (lua_State) the Lua stack to load into. - @param filename (string) full path and file name of script. - @param mode (string) controls whether the file can be text or binary (that is, a pre-compiled file). Possible values are: "b" only binary. @@ -400,7 +392,6 @@ static void luaDumpState(lua_State * L, const char * filename, const FILINFO * f Eg: "tc" or "btc" (forces "t", overrides "x"). Add "d" to keep extra debug info in the compiled binary. Eg: "td", "btd", or "tcd" (no effect with just "b" or with "x"). - @retval (int) SCRIPT_OK on success (LUA_OK) SCRIPT_NOFILE if file wasn't found for specified mode or Lua could not open file (LUA_ERRFILE) @@ -552,196 +543,141 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char * return ret; } -static int luaLoad(lua_State * L, const char * filename, ScriptInternalData & sid, ScriptInputsOutputs * sio=nullptr) +#if defined(SIMU) || defined(DEBUG) +// Get the name of a script for error reporting etc. +static const char * getScriptName(uint8_t idx) { - int init = 0; - int lstatus = 0; + int ref = scriptInternalData[idx].reference; - sid.instructions = 0; - sid.state = SCRIPT_OK; - - if (luaState == INTERPRETER_PANIC) { - return SCRIPT_PANIC; + if (ref <= SCRIPT_MIX_LAST) { + return g_model.scriptsData[ref - SCRIPT_MIX_FIRST].file; } - - luaSetInstructionsLimit(L, MANUAL_SCRIPTS_MAX_INSTRUCTIONS); - - PROTECT_LUA() { - sid.state = luaLoadScriptFileToState(L, filename, LUA_SCRIPT_LOAD_MODE); - if (sid.state == SCRIPT_OK && (lstatus = lua_pcall(L, 0, 1, 0)) == LUA_OK && lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - const char * key = lua_tostring(L, -2); - if (!strcmp(key, "init")) { - init = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushnil(L); - } - else if (!strcmp(key, "run")) { - sid.run = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushnil(L); - } - else if (!strcmp(key, "background")) { - sid.background = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushnil(L); - } - else if (sio && !strcmp(key, "input")) { - luaGetInputs(L, *sio); - } - else if (sio && !strcmp(key, "output")) { - luaGetOutputs(L, *sio); - } - } - - if (init) { - lua_rawgeti(L, LUA_REGISTRYINDEX, init); - if (lua_pcall(L, 0, 0, 0) != 0) { - TRACE_ERROR("luaLoad(%s): Error in script init(): %s\n", filename, lua_tostring(L, -1)); - sid.state = SCRIPT_SYNTAX_ERROR; - } - luaL_unref(L, LUA_REGISTRYINDEX, init); - lua_gc(L, LUA_GCCOLLECT, 0); - } - } - else if (sid.state == SCRIPT_OK) { - TRACE_ERROR("luaLoad(%s): Error parsing script (%d): %s\n", filename, lstatus, lua_tostring(L, -1)); - sid.state = SCRIPT_SYNTAX_ERROR; - } + else if (ref <= SCRIPT_FUNC_LAST) { + return g_model.customFn[ref - SCRIPT_FUNC_FIRST].play.name; } + else if (ref <= SCRIPT_GFUNC_LAST) { + return g_eeGeneral.customFn[ref - SCRIPT_GFUNC_FIRST].play.name; + } +#if defined(PCBTARANIS) + else if (ref <= SCRIPT_TELEMETRY_LAST) { + return g_model.screens[ref - SCRIPT_TELEMETRY_FIRST].script.file; + } +#endif else { - luaDisable(); - return SCRIPT_PANIC; + return "standalone"; } - UNPROTECT_LUA(); +} +#endif + +static bool luaLoad(const char * filename, ScriptInternalData & sid) +{ + sid.state = luaLoadScriptFileToState(lsScripts, filename, LUA_SCRIPT_LOAD_MODE); if (sid.state != SCRIPT_OK) { - luaFree(L, sid); + luaFree(lsScripts, sid); + return true; } - - luaDoGc(L, true); - - return sid.state; + return false; } -bool luaLoadMixScript(uint8_t index) +static bool luaLoadMixScript(uint8_t ref) { - ScriptData & sd = g_model.scriptsData[index]; + uint8_t idx = ref - SCRIPT_MIX_FIRST; + ScriptData & sd = g_model.scriptsData[idx]; if (ZEXIST(sd.file)) { ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; - ScriptInputsOutputs * sio = &scriptInputsOutputs[index]; - sid.reference = SCRIPT_MIX_FIRST+index; - sid.state = SCRIPT_NOFILE; + sid.reference = ref; + char filename[sizeof(SCRIPTS_MIXES_PATH) + LEN_SCRIPT_FILENAME + sizeof(SCRIPT_EXT)] = SCRIPTS_MIXES_PATH "/"; strncpy(filename + sizeof(SCRIPTS_MIXES_PATH), sd.file, LEN_SCRIPT_FILENAME); filename[sizeof(SCRIPTS_MIXES_PATH) + LEN_SCRIPT_FILENAME] = '\0'; strcat(filename + sizeof(SCRIPTS_MIXES_PATH), SCRIPT_EXT); - if (luaLoad(lsScripts, filename, sid, sio) == SCRIPT_PANIC) { - return false; - } + + return luaLoad(filename, sid); } - return true; + return false; } -bool luaLoadFunctionScript(uint8_t index, uint8_t ref) +static bool luaLoadFunctionScript(uint8_t ref) { + uint8_t idx; CustomFunctionData * fn; - if (ref < SCRIPT_GFUNC_FIRST) - fn = &g_model.customFn[index]; - else if (!g_model.noGlobalFunctions) - fn = &g_eeGeneral.customFn[index]; + if (ref <= SCRIPT_FUNC_LAST) { + idx = ref - SCRIPT_FUNC_FIRST; + fn = &g_model.customFn[idx]; + } + else if (!g_model.noGlobalFunctions) { + idx = ref - SCRIPT_GFUNC_FIRST; + fn = &g_eeGeneral.customFn[idx]; + } else - return true; + return false; - if (fn->func == FUNC_PLAY_SCRIPT && ZEXIST(fn->play.name)) { + if (fn -> func == FUNC_PLAY_SCRIPT && ZEXIST(fn -> play.name)) { if (luaScriptsCount < MAX_SCRIPTS) { ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; - sid.reference = ref + index; - sid.state = SCRIPT_NOFILE; + sid.reference = ref; + char filename[sizeof(SCRIPTS_FUNCS_PATH) + LEN_FUNCTION_NAME + sizeof(SCRIPT_EXT)] = SCRIPTS_FUNCS_PATH "/"; strncpy(filename + sizeof(SCRIPTS_FUNCS_PATH), fn->play.name, LEN_FUNCTION_NAME); filename[sizeof(SCRIPTS_FUNCS_PATH) + LEN_FUNCTION_NAME] = '\0'; strcat(filename + sizeof(SCRIPTS_FUNCS_PATH), SCRIPT_EXT); - if (luaLoad(lsScripts, filename, sid) == SCRIPT_PANIC) { - return false; - } + + return luaLoad(filename, sid); } else { POPUP_WARNING(STR_TOO_MANY_LUA_SCRIPTS); - return false; + return true; } } - return true; + return false; } #if defined(PCBTARANIS) -bool luaLoadTelemetryScript(uint8_t index) +static bool luaLoadTelemetryScript(uint8_t ref) { - TelemetryScreenType screenType = TELEMETRY_SCREEN_TYPE(index); + uint8_t idx = ref - SCRIPT_TELEMETRY_FIRST; + TelemetryScreenType screenType = TELEMETRY_SCREEN_TYPE(idx); if (screenType == TELEMETRY_SCREEN_TYPE_SCRIPT) { - TelemetryScriptData & script = g_model.screens[index].script; + TelemetryScriptData & script = g_model.screens[idx].script; + if (ZEXIST(script.file)) { if (luaScriptsCount < MAX_SCRIPTS) { ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; - sid.reference = SCRIPT_TELEMETRY_FIRST+index; - sid.state = SCRIPT_NOFILE; + sid.reference = ref; + char filename[sizeof(SCRIPTS_TELEM_PATH) + LEN_SCRIPT_FILENAME + sizeof(SCRIPT_EXT)] = SCRIPTS_TELEM_PATH "/"; strncpy(filename + sizeof(SCRIPTS_TELEM_PATH), script.file, LEN_SCRIPT_FILENAME); filename[sizeof(SCRIPTS_TELEM_PATH) + LEN_SCRIPT_FILENAME] = '\0'; strcat(filename + sizeof(SCRIPTS_TELEM_PATH), SCRIPT_EXT); - if (luaLoad(lsScripts, filename, sid) == SCRIPT_PANIC) { - return false; - } + + return luaLoad(filename, sid); } else { POPUP_WARNING(STR_TOO_MANY_LUA_SCRIPTS); - return false; + return true; } } } - return true; + return false; } #endif -uint8_t isTelemetryScriptAvailable(uint8_t index) +uint8_t isTelemetryScriptAvailable(uint8_t idx) { - for (int i=0; i 100) { - TRACE("Script killed"); - standaloneScript.state = SCRIPT_KILLED; - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; + // Run in the right interactive mode + if (allowLcdUsage != luaLcdAllowed) { +#if defined(PCBTARANIS) + if (luaLcdAllowed && scriptInternalData[0].reference != SCRIPT_STANDALONE && menuHandlers[menuLevel] != menuViewTelemetry) { + // Telemetry screen was exited while foreground function was preempted - finish in the background + luaLcdAllowed = false; + } + else +#endif + return scriptWasRun; + } + + do { + ScriptInternalData & sid = scriptInternalData[idx]; + if (sid.state != SCRIPT_OK) continue; + + uint8_t ref = sid.reference; + int inputsCount = 0; + int luaStatus = lua_status(lsScripts); + + if (luaStatus == LUA_OK) { + // Not preempted - setup another function call + lua_settop(lsScripts, 0); + + if (allowLcdUsage) { +#if defined(PCBTARANIS) + if ((menuHandlers[menuLevel] == menuViewTelemetry && ref == SCRIPT_TELEMETRY_FIRST + s_frsky_view) || ref == SCRIPT_STANDALONE) { +#else + if (ref == SCRIPT_STANDALONE) { +#endif + // Pull a new event from the buffer + evt = events[0]; + events[0] = events[1]; + events[1] = 0; + + lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); + lua_pushunsigned(lsScripts, evt); + inputsCount = 1; + } + else continue; + } + else { + if (ref <= SCRIPT_MIX_LAST) { + lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); + + ScriptData & sd = g_model.scriptsData[ref - SCRIPT_MIX_FIRST]; + ScriptInputsOutputs * sio = & scriptInputsOutputs[ref - SCRIPT_MIX_FIRST]; + inputsCount = sio -> inputsCount; + + for (int j = 0; j < inputsCount; j++) { + if (sio -> inputs[j].type == INPUT_TYPE_SOURCE) + luaGetValueAndPush(lsScripts, sd.inputs[j].source); + else + lua_pushinteger(lsScripts, sd.inputs[j].value + sio -> inputs[j].def); + } + } + else if (ref <= SCRIPT_GFUNC_LAST) { + CustomFunctionData * fn; + + if (ref <= SCRIPT_FUNC_LAST) + fn = &g_model.customFn[ref - SCRIPT_FUNC_FIRST]; + else + fn = &g_eeGeneral.customFn[ref - SCRIPT_GFUNC_FIRST]; + + if (getSwitch(fn -> swtch)) { + lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); + } + else { + if (sid.background == LUA_NOREF) continue; + lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.background); + } + } +#if defined(PCBTARANIS) + else if (ref <= SCRIPT_TELEMETRY_LAST) { + if (sid.background == LUA_NOREF) continue; + lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.background); + } +#endif + else continue; + } + } + + // Full garbage collection at the start of every cycle + luaDoGc(lsScripts, fullGC); + fullGC = false; + + // Resume running the coroutine + luaStatus = lua_resume(lsScripts, 0, inputsCount); + + if (luaStatus == LUA_YIELD) { + // Coroutine yielded - wait for the next cycle + return scriptWasRun; + } + else if (luaStatus == LUA_OK) { + // Coroutine returned + scriptWasRun = true; + + if (ref <= SCRIPT_MIX_LAST) { + ScriptInputsOutputs * sio = & scriptInputsOutputs[ref - SCRIPT_MIX_FIRST]; + lua_settop(lsScripts, sio -> outputsCount); + + for (int j = sio -> outputsCount - 1; j >= 0; j--) { + if (!lua_isnumber(lsScripts, -1)) { + TRACE_ERROR("Script %s: run function did not return a number\n", getScriptName(idx)); + sid.state = SCRIPT_SYNTAX_ERROR; + break; + } + sio -> outputs[j].value = lua_tointeger(lsScripts, -1); + lua_pop(lsScripts, 1); + } + } + else if (ref == SCRIPT_STANDALONE) { + lua_settop(lsScripts, 1); + if (lua_isnumber(lsScripts, -1)) { + int scriptResult = lua_tointeger(lsScripts, -1); + lua_pop(lsScripts, 1); /* pop returned value */ + + if (scriptResult != 0) { + TRACE("Script finished with status %d", scriptResult); + sid.state = SCRIPT_FINISHED; + } + else if (luaDisplayStatistics) { + #if defined(COLORLCD) + #else + lcdDrawSolidHorizontalLine(0, 7*FH-1, lcdLastRightPos+6, ERASE); + lcdDrawText(0, 7*FH, "GV Use: "); + lcdDrawNumber(lcdLastRightPos, 7*FH, luaGetMemUsed(lsScripts), LEFT); + lcdDrawChar(lcdLastRightPos, 7*FH, 'b'); + lcdDrawSolidHorizontalLine(0, 7*FH-2, lcdLastRightPos+6, FORCE); + lcdDrawVerticalLine(lcdLastRightPos+6, 7*FH-2, FH+2, SOLID, FORCE); + #endif + } } else if (lua_isstring(lsScripts, -1)) { char nextScript[FF_MAX_LFN+1]; strncpy(nextScript, lua_tostring(lsScripts, -1), FF_MAX_LFN); nextScript[FF_MAX_LFN] = '\0'; luaExec(nextScript); + return scriptWasRun; } else { - TRACE("Script run function returned unexpected value"); - standaloneScript.state = SCRIPT_SYNTAX_ERROR; - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; + TRACE_ERROR("Script run function returned unexpected value\n"); + sid.state = SCRIPT_SYNTAX_ERROR; } - } - else { - int scriptResult = lua_tointeger(lsScripts, -1); - lua_pop(lsScripts, 1); /* pop returned value */ - if (scriptResult != 0) { - TRACE("Script finished with status %d", scriptResult); - standaloneScript.state = SCRIPT_NOFILE; - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; - return; - } - else if (luaDisplayStatistics) { -#if !defined(COLORLCD) - lcdDrawSolidHorizontalLine(0, 7*FH-1, lcdLastRightPos+6, ERASE); - lcdDrawText(0, 7*FH, "GV Use: "); - lcdDrawNumber(lcdLastRightPos, 7*FH, luaGetMemUsed(lsScripts), LEFT); - lcdDrawChar(lcdLastRightPos, 7*FH, 'b'); - lcdDrawSolidHorizontalLine(0, 7*FH-2, lcdLastRightPos+6, FORCE); - lcdDrawVerticalLine(lcdLastRightPos+6, 7*FH-2, FH+2, SOLID, FORCE); -#endif - } - } - } - else { - TRACE("Script error: %s", lua_tostring(lsScripts, -1)); - standaloneScript.state = (instructionsPercent > 100 ? SCRIPT_KILLED : SCRIPT_SYNTAX_ERROR); - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; - } - if (standaloneScript.state != SCRIPT_OK) { - luaError(lsScripts, standaloneScript.state); - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; - } - - if (evt == EVT_KEY_LONG(KEY_EXIT)) { - TRACE("Script force exit"); - killEvents(evt); - standaloneScript.state = SCRIPT_NOFILE; - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; - } + if (evt == EVT_KEY_LONG(KEY_EXIT)) { + TRACE("Script force exit"); + killEvents(evt); + luaEmptyEventBuffer(); + sid.state = SCRIPT_FINISHED; + } #if defined(KEYS_GPIO_REG_MENU) - // TODO find another key and add a #define - else if (evt == EVT_KEY_LONG(KEY_MENU)) { - killEvents(evt); - luaDisplayStatistics = !luaDisplayStatistics; - } -#endif - } - else { - TRACE("Script run method missing"); - standaloneScript.state = SCRIPT_SYNTAX_ERROR; - luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; - } -} - -bool luaDoOneRunPermanentScript(event_t evt, int i, uint32_t scriptType) -{ - ScriptInternalData & sid = scriptInternalData[i]; - if (sid.state != SCRIPT_OK) return false; - - luaSetInstructionsLimit(lsScripts, PERMANENT_SCRIPTS_MAX_INSTRUCTIONS); - int inputsCount = 0; -#if defined(SIMU) || defined(DEBUG) - const char *filename; -#endif - ScriptInputsOutputs * sio = nullptr; -#if SCRIPT_MIX_FIRST > 0 - if ((scriptType & RUN_MIX_SCRIPT) && (sid.reference >= SCRIPT_MIX_FIRST && sid.reference <= SCRIPT_MIX_LAST)) { -#else - if ((scriptType & RUN_MIX_SCRIPT) && (sid.reference <= SCRIPT_MIX_LAST)) { -#endif - ScriptData & sd = g_model.scriptsData[sid.reference-SCRIPT_MIX_FIRST]; - sio = &scriptInputsOutputs[sid.reference-SCRIPT_MIX_FIRST]; - inputsCount = sio->inputsCount; -#if defined(SIMU) || defined(DEBUG) - filename = sd.file; -#endif - lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); - for (int j=0; jinputsCount; j++) { - if (sio->inputs[j].type == INPUT_TYPE_SOURCE) - luaGetValueAndPush(lsScripts, sd.inputs[j].source); - else - lua_pushinteger(lsScripts, sd.inputs[j].value + sio->inputs[j].def); - } - } - else if ((scriptType & RUN_FUNC_SCRIPT) && (sid.reference >= SCRIPT_FUNC_FIRST && sid.reference <= SCRIPT_GFUNC_LAST)) { - CustomFunctionData & fn = (sid.reference < SCRIPT_GFUNC_FIRST ? g_model.customFn[sid.reference-SCRIPT_FUNC_FIRST] : g_eeGeneral.customFn[sid.reference-SCRIPT_GFUNC_FIRST]); -#if defined(SIMU) || defined(DEBUG) - filename = fn.play.name; -#endif - if (getSwitch(fn.swtch)) - lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); - else if (sid.background) - lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.background); - else - return false; - } - else { -#if defined(PCBTARANIS) -#if defined(SIMU) || defined(DEBUG) - TelemetryScriptData & script = g_model.screens[sid.reference-SCRIPT_TELEMETRY_FIRST].script; - filename = script.file; -#endif - if ((scriptType & RUN_TELEM_FG_SCRIPT) && (menuHandlers[0]==menuViewTelemetry && sid.reference==SCRIPT_TELEMETRY_FIRST+s_frsky_view)) { - lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); - lua_pushunsigned(lsScripts, evt); - inputsCount = 1; - } - else if ((scriptType & RUN_TELEM_BG_SCRIPT) && (sid.background)) { - lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.background); - } - else { - return false; - } -#else // !PCBTARANIS - // COLORLCD - return false; -#endif - } - - if (lua_pcall(lsScripts, inputsCount, sio ? sio->outputsCount : 0, 0) == 0) { - if (sio) { - for (int j=sio->outputsCount-1; j>=0; j--) { - if (!lua_isnumber(lsScripts, -1)) { - sid.state = (instructionsPercent > 100 ? SCRIPT_KILLED : SCRIPT_SYNTAX_ERROR); - TRACE("Script %8s disabled", filename); - break; + // TODO find another key and add a #define + else if (evt == EVT_KEY_LONG(KEY_MENU)) { + killEvents(evt); + luaEmptyEventBuffer(); + luaDisplayStatistics = !luaDisplayStatistics; } - sio->outputs[j].value = lua_tointeger(lsScripts, -1); - lua_pop(lsScripts, 1); +#endif } } - } - else { - if (instructionsPercent > 100) { - TRACE("Script %8s killed", filename); - sid.state = SCRIPT_KILLED; - } else { - TRACE("Script %8s error: %s", filename, lua_tostring(lsScripts, -1)); + // Error sid.state = SCRIPT_SYNTAX_ERROR; + TRACE_ERROR("%s: %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); + + if (sid.reference == SCRIPT_STANDALONE) + luaError(lsScripts, sid.state); + else { + // Replace the dead coroutine with a new one + lua_pop(L, 1); // Pop the dead coroutine off the main stack + lsScripts = lua_newthread(L); // Push the new coroutine + } } - } - if (sid.state != SCRIPT_OK) { - luaFree(lsScripts, sid); - } - else { - if (instructionsPercent > sid.instructions) { - sid.instructions = instructionsPercent; + if (sid.state != SCRIPT_OK) { + if (sid.reference == SCRIPT_STANDALONE) { + luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; + return scriptWasRun; + } + else luaFree(lsScripts, sid); } - } - return true; -} + } while (++idx < luaScriptsCount); + + // Toggle between background and foreground scripts + luaLcdAllowed = !luaLcdAllowed; + idx = 0; + + return scriptWasRun; +} //resumeLua(...) -// This loop-pass should run in checkEvents(). -// However, libopenui has 2 main separated routines: -// - checkEvents(): runs the event loop and can effect an async redraw (if visible) -// - paint(): (if visible) the redraw itself -// -bool luaTask(event_t evt, uint8_t scriptType, bool allowLcdUsage) +bool luaTask(event_t evt, bool allowLcdUsage) { - if (luaState == INTERPRETER_PANIC) return false; - luaLcdAllowed = allowLcdUsage; + bool init = false; bool scriptWasRun = false; - // TRACE("luaTask(0x%x,0x%x,%s)", - // evt, scriptType, - // allowLcdUsage ? "true" : "false"); - - // we run either standalone script or permanent scripts - if (luaState & INTERPRETER_RUNNING_STANDALONE_SCRIPT) { - // run standalone script - if ((scriptType & RUN_STNDAL_SCRIPT) == 0) return false; - PROTECT_LUA() { - luaDoOneRunStandalone(evt); - scriptWasRun = true; - } - else { - luaDisable(); - return false; - } - UNPROTECT_LUA(); + // Add event to buffer + if (evt != 0) { + if (events[0] == 0) events[0] = evt; + else if (events[1] == 0) events[1] = evt; } - else { - // run permanent scripts - if (luaState & INTERPRETER_RELOAD_PERMANENT_SCRIPTS) { - luaState = 0; - luaInit(); - if (luaState == INTERPRETER_PANIC) return false; - luaLoadPermanentScripts(); - if (luaState == INTERPRETER_PANIC) return false; - } - for (int i=0; i LUA_MEM_MAX) { - TRACE("checkLuaMemoryUsage(): max limit reached (%u), killing Lua", totalMemUsed); + TRACE_ERROR("checkLuaMemoryUsage(): max limit reached (%u), killing Lua\n", totalMemUsed); // disable Lua scripts luaClose(&lsScripts); luaDisable(); @@ -1127,6 +1182,7 @@ void checkLuaMemoryUsage() #endif } + uint32_t luaGetMemUsed(lua_State * L) { return L ? (lua_gc(L, LUA_GCCOUNT, 0) << 10) + lua_gc(L, LUA_GCCOUNTB, 0) : 0; @@ -1137,25 +1193,36 @@ void luaInit() TRACE("luaInit"); luaClose(&lsScripts); + L = nullptr; if (luaState != INTERPRETER_PANIC) { #if defined(USE_BIN_ALLOCATOR) - lsScripts = lua_newstate(bin_l_alloc, nullptr); //we use our own allocator! + L = lua_newstate(bin_l_alloc, nullptr); //we use our own allocator! #elif defined(LUA_ALLOCATOR_TRACER) - memset(&lsScriptsTrace, 0 , sizeof(lsScriptsTrace)); + memset(&lsScriptsTrace, 0 , sizeof(lsScriptsTrace); lsScriptsTrace.script = "lua_newstate(scripts)"; - lsScripts = lua_newstate(tracer_alloc, &lsScriptsTrace); //we use tracer allocator + L = lua_newstate(tracer_alloc, &lsScriptsTrace); //we use tracer allocator #else - lsScripts = lua_newstate(l_alloc, nullptr); //we use Lua default allocator + L = lua_newstate(l_alloc, nullptr); //we use Lua default allocator #endif - if (lsScripts) { + if (L) { // install our panic handler - lua_atpanic(lsScripts, &custom_lua_atpanic); + lua_atpanic(L, &custom_lua_atpanic); #if defined(LUA_ALLOCATOR_TRACER) - lua_sethook(lsScripts, luaHook, LUA_MASKLINE, 0); + lua_sethook(L, luaHook, LUA_MASKCOUNT|LUA_MASKLINE, PERMANENT_SCRIPTS_MAX_INSTRUCTIONS); +#else + lua_sethook(L, luaHook, LUA_MASKCOUNT, PERMANENT_SCRIPTS_MAX_INSTRUCTIONS); #endif + // lsScripts is now a coroutine in lieu of the main thread to support preemption + lsScripts = lua_newthread(L); + + // Clear loaded scripts + memset(scriptInternalData, 0, sizeof(scriptInternalData)); + memset(scriptInputsOutputs, 0, sizeof(scriptInputsOutputs)); + luaScriptsCount = 0; + // protect libs and constants registration PROTECT_LUA() { luaRegisterLibraries(lsScripts); diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 36f658d1a..30626eaba 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -47,15 +47,19 @@ extern Fifo * luaRxFifo; #endif extern lua_State * lsScripts; -extern lua_State * lsWidgets; + extern bool luaLcdAllowed; + #if defined(COLORLCD) +extern lua_State * lsWidgets; extern uint32_t luaExtraMemoryUsage; +void luaInitThemesAndWidgets(); #endif void luaInit(); -void luaInitThemesAndWidgets(); +void luaEmptyEventBuffer(); +#define LUA_INIT_THEMES_AND_WIDGETS() luaInitThemesAndWidgets() #define lua_registernumber(L, n, i) (lua_pushnumber(L, (i)), lua_setglobal(L, (n))) #define lua_registerint(L, n, i) (lua_pushinteger(L, (i)), lua_setglobal(L, (n))) #define lua_pushtablenil(L, k) (lua_pushstring(L, (k)), lua_pushnil(L), lua_settable(L, -3)) @@ -78,12 +82,6 @@ void luaInitThemesAndWidgets(); #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) -#define RUN_FUNC_SCRIPT (1 << 1) -#define RUN_TELEM_BG_SCRIPT (1 << 2) -#define RUN_TELEM_FG_SCRIPT (1 << 3) -#define RUN_STNDAL_SCRIPT (1 << 4) - enum luaScriptInputType { INPUT_TYPE_FIRST = 0, INPUT_TYPE_VALUE = INPUT_TYPE_FIRST, @@ -98,17 +96,20 @@ struct ScriptInput { int16_t max; int16_t def; }; + struct ScriptOutput { const char *name; int16_t value; }; + enum ScriptState { SCRIPT_OK, SCRIPT_NOFILE, SCRIPT_SYNTAX_ERROR, SCRIPT_PANIC, - SCRIPT_KILLED + SCRIPT_FINISHED }; + enum ScriptReference { SCRIPT_MIX_FIRST, SCRIPT_MIX_LAST=SCRIPT_MIX_FIRST+MAX_SCRIPTS-1, @@ -116,9 +117,13 @@ enum ScriptReference { SCRIPT_FUNC_LAST=SCRIPT_FUNC_FIRST+MAX_SPECIAL_FUNCTIONS-1, // model functions SCRIPT_GFUNC_FIRST, SCRIPT_GFUNC_LAST=SCRIPT_GFUNC_FIRST+MAX_SPECIAL_FUNCTIONS-1, // global functions +#if defined(PCBTARANIS) SCRIPT_TELEMETRY_FIRST, - SCRIPT_TELEMETRY_LAST=SCRIPT_TELEMETRY_FIRST+MAX_SCRIPTS, // telem0 and telem1 .. telem7 + SCRIPT_TELEMETRY_LAST=SCRIPT_TELEMETRY_FIRST+MAX_SCRIPTS, // telem0 and telem1 .. telem7 +#endif + SCRIPT_STANDALONE // Standalone script }; + struct ScriptInternalData { uint8_t reference; uint8_t state; @@ -126,41 +131,55 @@ struct ScriptInternalData { int background; uint8_t instructions; }; + struct ScriptInputsOutputs { uint8_t inputsCount; ScriptInput inputs[MAX_SCRIPT_INPUTS]; uint8_t outputsCount; ScriptOutput outputs[MAX_SCRIPT_OUTPUTS]; }; -#define INTERPRETER_RUNNING_STANDALONE_SCRIPT 1 -#define INTERPRETER_RELOAD_PERMANENT_SCRIPTS 2 -#define INTERPRETER_PANIC 255 + + +enum InterpreterState { + INTERPRETER_RELOAD_PERMANENT_SCRIPTS = 1, + INTERPRETER_LOADING, + INTERPRETER_START_RUNNING, + INTERPRETER_RUNNING, + INTERPRETER_PANIC = 255 +}; + extern uint8_t luaState; extern uint8_t luaScriptsCount; extern bool luaLcdAllowed; -extern ScriptInternalData standaloneScript; + extern ScriptInternalData scriptInternalData[MAX_SCRIPTS]; extern ScriptInputsOutputs scriptInputsOutputs[MAX_SCRIPTS]; + void luaClose(lua_State ** L); -bool luaTask(event_t evt, uint8_t scriptType, bool allowLcdUsage); +bool luaTask(event_t evt, bool allowLcdUsage); void checkLuaMemoryUsage(); void luaExec(const char * filename); void luaDoGc(lua_State * L, bool full); void luaError(lua_State * L, uint8_t error, bool acknowledge=true); uint32_t luaGetMemUsed(lua_State * L); void luaGetValueAndPush(lua_State * L, int src); -#define luaGetCpuUsed(idx) scriptInternalData[idx].instructions uint8_t isTelemetryScriptAvailable(uint8_t index); -#define LUA_LOAD_MODEL_SCRIPTS() luaState |= INTERPRETER_RELOAD_PERMANENT_SCRIPTS -#define LUA_LOAD_MODEL_SCRIPT(idx) luaState |= INTERPRETER_RELOAD_PERMANENT_SCRIPTS + +#define luaGetCpuUsed(idx) scriptInternalData[idx].instructions +#define LUA_LOAD_MODEL_SCRIPTS() luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS +#define LUA_LOAD_MODEL_SCRIPT(idx) luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS + // Lua PROTECT/UNPROTECT #include + struct our_longjmp { struct our_longjmp *previous; jmp_buf b; volatile int status; /* error code */ }; + extern struct our_longjmp * global_lj; + #define PROTECT_LUA() { struct our_longjmp lj; \ lj.previous = global_lj; /* chain new error handler */ \ global_lj = &lj; \ @@ -172,14 +191,16 @@ extern uint16_t maxLuaDuration; extern uint8_t instructionsPercent; #if defined(KEYS_GPIO_REG_PAGE) - #define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER && ((luaState & INTERPRETER_RUNNING_STANDALONE_SCRIPT) || (key) != KEY_PAGE)) + #define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER && ((scriptInternalData[0].reference == SCRIPT_STANDALONE) || (key) != KEY_PAGE)) #else #define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER) #endif + struct LuaField { uint16_t id; char desc[50]; }; + bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags=0); void luaLoadThemes(); void luaRegisterLibraries(lua_State * L); @@ -207,8 +228,6 @@ struct LuaMemTracer { }; void * tracer_alloc(void * ud, void * ptr, size_t osize, size_t nsize); -void luaHook(lua_State * L, lua_Debug *ar); - #else // defined(LUA) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index a5d3dae8b..a45278620 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -40,6 +40,57 @@ extern int custom_lua_atpanic(lua_State *L); #define LUA_WIDGET_FILENAME "/main.lua" #define LUA_FULLPATH_MAXLEN (LEN_FILE_PATH_MAX + LEN_SCRIPT_FILENAME + LEN_FILE_EXTENSION_MAX) // max length (example: /SCRIPTS/THEMES/mytheme.lua) +static void luaHook(lua_State * L, lua_Debug *ar) +{ + if (ar->event == LUA_HOOKCOUNT) { + 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 + } +#if defined(LUA_ALLOCATOR_TRACER) + else if (ar->event == LUA_HOOKLINE) { + lua_getinfo(L, "nSl", ar); + LuaMemTracer * tracer = GET_TRACER(L); + if (tracer->alloc || tracer->free) { + TRACE("LT: [+%u,-%u] %s:%d", tracer->alloc, tracer->free, tracer->script, tracer->lineno); + } + tracer->script = ar->source; + tracer->lineno = ar->currentline; + tracer->alloc = 0; + tracer->free = 0; + } +#endif // #if defined(LUA_ALLOCATOR_TRACER) +} + +void luaSetInstructionsLimit(lua_State * L, int count) +{ + instructionsPercent = 0; +#if defined(LUA_ALLOCATOR_TRACER) + lua_sethook(L, luaHook, LUA_MASKCOUNT|LUA_MASKLINE, count); +#else + lua_sethook(L, luaHook, LUA_MASKCOUNT, count); +#endif +} + void exec(int function, int nresults=0) { if (lsWidgets == 0) return; @@ -344,12 +395,16 @@ void LuaWidget::refresh(BitmapBuffer* dc) // Enable drawing into the current LCD buffer luaLcdBuffer = dc; + + // This little hack is needed to not interfere with the LCD usage of preempted scripts + bool lla = luaLcdAllowed; luaLcdAllowed = true; + if (lua_pcall(lsWidgets, 1, 0, 0) != 0) { setErrorMessage("refresh()"); } // Remove LCD - luaLcdAllowed = false; + luaLcdAllowed = lla; luaLcdBuffer = nullptr; // mark as refreshed diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 24dd94066..5c927db79 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -356,7 +356,7 @@ void guiMain(event_t evt) DEBUG_TIMER_START(debugTimerLua); // Run Lua scripts first that don't use LCD - luaTask( 0, RUN_MIX_SCRIPT | RUN_FUNC_SCRIPT, false); + luaTask( 0, false); // This is run from StandaloneLuaWindow::checkEvents() // luaTask(evt, RUN_STNDAL_SCRIPT, true); @@ -382,29 +382,28 @@ void guiMain(event_t evt) } #elif defined(GUI) -void handleGui(event_t event) { - // if Lua standalone, run it and don't clear the screen (Lua will do it) - // else if Lua telemetry view, run it and don't clear the screen - // else clear scren and show normal menus +bool handleGui(event_t event) { + bool refreshNeeded; #if defined(LUA) - if (luaTask(event, RUN_STNDAL_SCRIPT, true)) { - // standalone script is active + refreshNeeded = luaTask(event, true); + if (menuHandlers[menuLevel] == menuViewTelemetry && TELEMETRY_SCREEN_TYPE(s_frsky_view) == TELEMETRY_SCREEN_TYPE_SCRIPT) { + menuHandlers[menuLevel](event); } - else if (luaTask(event, RUN_TELEM_FG_SCRIPT, true)) { - // the telemetry screen is active - menuHandlers[menuLevel](event); - } - else + else if (scriptInternalData[0].reference != SCRIPT_STANDALONE) #endif +// No foreground Lua script is running - clear the screen show normal menu { lcdClear(); menuHandlers[menuLevel](event); drawStatusLine(); + refreshNeeded = true; } + return refreshNeeded; } void guiMain(event_t evt) { + bool refreshNeeded = menuEvent || warningText || (popupMenuItemsCount > 0); #if defined(LUA) // TODO better lua stopwatch uint32_t t0 = get_tmr10ms(); @@ -416,7 +415,7 @@ void guiMain(event_t evt) } // run Lua scripts that don't use LCD (to use CPU time while LCD DMA is running) - luaTask(0, RUN_MIX_SCRIPT | RUN_FUNC_SCRIPT | RUN_TELEM_BG_SCRIPT, false); + luaTask(0, false); t0 = get_tmr10ms() - t0; if (t0 > maxLuaDuration) { @@ -440,10 +439,10 @@ void guiMain(event_t evt) } if (isEventCaughtByPopup()) { - handleGui(0); + refreshNeeded |= handleGui(0); } else { - handleGui(evt); + refreshNeeded |= handleGui(evt); evt = 0; } @@ -463,8 +462,8 @@ void guiMain(event_t evt) } } - lcdRefresh(); - + if (refreshNeeded) lcdRefresh(); + if (mainRequestFlags & (1u << REQUEST_SCREENSHOT)) { writeScreenshot(); mainRequestFlags &= ~(1u << REQUEST_SCREENSHOT); From c76532f33af759149a09e17a1c7acb590e046453 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Tue, 22 Jun 2021 16:44:10 -0400 Subject: [PATCH 11/18] Fixed Lua error messages in standalone and telemetry scripts. TODO: If a standalone script errors in init() on COLORLCD it just quits without showing error. Is that because it calls luaError from luaExec() in radio_tools.cpp instead of from luaTask() in standalone_lua.cpp? --- radio/src/lua/interface.cpp | 76 ++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 23 deletions(-) diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index d7b56f140..359135409 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -115,6 +115,7 @@ static void luaHook(lua_State * L, lua_Debug *ar) lua_yield(lsScripts, 0); } } + #if defined(LUA_ALLOCATOR_TRACER) else if (ar->event == LUA_HOOKLINE) { lua_getinfo(L, "nSl", ar); @@ -136,16 +137,6 @@ void luaEmptyEventBuffer() events[1] = 0; } -void luaSetInstructionsLimit(lua_State * L, int count) -{ - instructionsPercent = 0; -#if defined(LUA_ALLOCATOR_TRACER) - lua_sethook(L, luaHook, LUA_MASKCOUNT|LUA_MASKLINE, count); -#else - lua_sethook(L, luaHook, LUA_MASKCOUNT, count); -#endif -} - int luaGetInputs(lua_State * L2, ScriptInputsOutputs & sid) { if (!lua_istable(L2, -1)) @@ -370,7 +361,7 @@ static void luaDumpState(lua_State * L, const char * filename, const FILINFO * f TRACE("luaDumpState(%s): Saved bytecode to file.", filename); } } else - TRACE_ERROR("luaDumpState(%s): Error: Could not open output file.", filename); + TRACE_ERROR("luaDumpState(%s): Error: Could not open output file\n", filename); } #endif // LUA_COMPILER @@ -685,18 +676,46 @@ void displayLuaError(const char * title) #if !defined(COLORLCD) drawMessageBox(title); #endif + if (lua_warning_info[0]) { - char * split = strstr(lua_warning_info, ": "); + char *split = strstr(lua_warning_info, ": "); +#if !defined(COLORLCD) if (split) { - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH+3, lua_warning_info, split-lua_warning_info, SMLSIZE); - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+2*FH+2, split+2, lua_warning_info+LUA_WARNING_INFO_LEN-split, SMLSIZE); - } - else { - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH+3, lua_warning_info, 40, SMLSIZE); +#if LCD_W == 128 + if (strlen(split + 2) <= 20) { + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + FH + 3, + lua_warning_info, split - lua_warning_info, SMLSIZE); + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + 2 * FH + 2, split + 2, + strlen(split + 2), SMLSIZE); + } else { + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + FH, lua_warning_info, + split - lua_warning_info, SMLSIZE); + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + 2 * FH, split + 2, 20, + SMLSIZE); + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + 3 * FH, split + 22, + strlen(split + 22), SMLSIZE); + } +#else + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + FH + 3, + lua_warning_info, split - lua_warning_info, SMLSIZE); + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + 2 * FH + 2, split + 2, + lua_warning_info + LUA_WARNING_INFO_LEN - split, + SMLSIZE); +#endif + } else { + // TODO lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y + FH + 3, + // lua_warning_info, 40, SMLSIZE); } +#else + // Split line... + //if (split) { *(split+1) = '\n'; } + (void)split; // mark as unused + POPUP_WARNING(title, lua_warning_info); +#endif } } +#if !defined(COLORLCD) void displayAcknowledgeLuaError(event_t event) { warningResult = false; @@ -705,6 +724,8 @@ void displayAcknowledgeLuaError(event_t event) warningText = nullptr; } } +#endif + void luaError(lua_State * L, uint8_t error, bool acknowledge) { const char * errorTitle; @@ -720,22 +741,32 @@ void luaError(lua_State * L, uint8_t error, bool acknowledge) errorTitle = STR_SCRIPT_ERROR; break; } + const char * msg = lua_tostring(L, -1); if (msg) { #if defined(SIMU) if (!strncmp(msg, ".", 2)) msg += 1; #endif +#if LCD_W == 128 + msg = strrchr(msg, '/') + 1; +#else if (!strncmp(msg, "/SCRIPTS/", 9)) msg += 9; +#endif strncpy(lua_warning_info, msg, LUA_WARNING_INFO_LEN); lua_warning_info[LUA_WARNING_INFO_LEN] = '\0'; } else { lua_warning_info[0] = '\0'; } + if (acknowledge) { +#if !defined(COLORLCD) warningText = errorTitle; warningType = WARNING_TYPE_INFO; popupFunc = displayAcknowledgeLuaError; +#else + displayLuaError(errorTitle); +#endif } else { displayLuaError(errorTitle); @@ -881,7 +912,10 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) if (initFunction != LUA_NOREF) TRACE_ERROR("luaLoadScripts(%s): init function: %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); - else + luaL_unref(lsScripts, LUA_REGISTRYINDEX, initFunction); + lua_settop(lsScripts, 0); + initFunction = LUA_NOREF; + } else TRACE_ERROR("luaLoadScripts(%s): %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); if (ref == SCRIPT_STANDALONE) { @@ -889,11 +923,7 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; return; } - - if (initFunction != LUA_NOREF) { - luaL_unref(lsScripts, LUA_REGISTRYINDEX, initFunction); - initFunction = LUA_NOREF; - } + // Replace the dead coroutine with a new one lua_pop(L, 1); // Pop the dead coroutine off the main stack lsScripts = lua_newthread(L); // Push the new coroutine From dcac3cb9da5c56da9535693206f686b774ae44e1 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Wed, 23 Jun 2021 17:44:05 -0400 Subject: [PATCH 12/18] Fixed Lua error messages in standalone and telemetry scripts - again. There is still a problem that the call to POPUP_WARNING in displayLuaError does not return and the gui goes dark on colorlcd. Could it be long jump? --- radio/src/gui/colorlcd/standalone_lua.cpp | 13 +++++++++---- radio/src/lua/interface.cpp | 7 ++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/colorlcd/standalone_lua.cpp b/radio/src/gui/colorlcd/standalone_lua.cpp index abe74cf81..4f4306977 100644 --- a/radio/src/gui/colorlcd/standalone_lua.cpp +++ b/radio/src/gui/colorlcd/standalone_lua.cpp @@ -156,17 +156,22 @@ void StandaloneLuaWindow::runLua(event_t evt) luaLcdBuffer = &lcdBuffer; TRACE("evt = 0x%x", evt); + + bool hasRun = luaTask(evt, true); + + if (luaState == INTERPRETER_RELOAD_PERMANENT_SCRIPTS) { + // Script does not run anymore... + TRACE("LUA standalone script exited: deleting window!"); + deleteLater(); + } - bool hasRun = luaTask(evt, RUN_STNDAL_SCRIPT, true); if (hasRun) { #if defined(DEBUG_WINDOWS) TRACE("# StandaloneLuaWindow::invalidate()"); #endif invalidate(); } else { - // Script does not run anymore... - TRACE("LUA standalone script exited: deleting window!"); - deleteLater(); + // The script was preempted, and the LCD should not be updated yet } // Kill global LUA LCD buffer diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 359135409..419019f67 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -912,15 +912,12 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) if (initFunction != LUA_NOREF) TRACE_ERROR("luaLoadScripts(%s): init function: %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); - luaL_unref(lsScripts, LUA_REGISTRYINDEX, initFunction); - lua_settop(lsScripts, 0); - initFunction = LUA_NOREF; - } else + else TRACE_ERROR("luaLoadScripts(%s): %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); if (ref == SCRIPT_STANDALONE) { - luaError(lsScripts, sid.state); luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; + luaError(lsScripts, sid.state, true); return; } From 76d2ef54e35230a30955f71da3743bb7a3298758 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Sat, 26 Jun 2021 12:47:14 -0400 Subject: [PATCH 13/18] Fixing standalone scripts with preemption on colorlcd --- radio/src/gui/colorlcd/standalone_lua.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/radio/src/gui/colorlcd/standalone_lua.cpp b/radio/src/gui/colorlcd/standalone_lua.cpp index 4f4306977..95bd504d0 100644 --- a/radio/src/gui/colorlcd/standalone_lua.cpp +++ b/radio/src/gui/colorlcd/standalone_lua.cpp @@ -155,25 +155,23 @@ void StandaloneLuaWindow::runLua(event_t evt) // Set global LUA LCD buffer luaLcdBuffer = &lcdBuffer; - TRACE("evt = 0x%x", evt); + if (luaState != INTERPRETER_RELOAD_PERMANENT_SCRIPTS) { + if (luaTask(evt, true)) { +#if defined(DEBUG_WINDOWS) + TRACE("# StandaloneLuaWindow::invalidate()"); +#endif + invalidate(); + } else { + // The script was preempted, and the LCD should not be updated yet + } + } - bool hasRun = luaTask(evt, true); - if (luaState == INTERPRETER_RELOAD_PERMANENT_SCRIPTS) { // Script does not run anymore... TRACE("LUA standalone script exited: deleting window!"); deleteLater(); } - if (hasRun) { -#if defined(DEBUG_WINDOWS) - TRACE("# StandaloneLuaWindow::invalidate()"); -#endif - invalidate(); - } else { - // The script was preempted, and the LCD should not be updated yet - } - // Kill global LUA LCD buffer luaLcdBuffer = nullptr; } From 56718388641b6b570ac0bc3e4230c0020efb66d2 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Fri, 9 Jul 2021 18:00:43 -0400 Subject: [PATCH 14/18] Cleaned up code for Mixer/Custom/Model scripts and added compiler directives --- radio/src/lua/interface.cpp | 176 +++++++++++++++++++----------------- radio/src/lua/lua_api.h | 2 + 2 files changed, 97 insertions(+), 81 deletions(-) diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 419019f67..4f2fea594 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -137,34 +137,35 @@ void luaEmptyEventBuffer() events[1] = 0; } -int luaGetInputs(lua_State * L2, ScriptInputsOutputs & sid) +#if defined(LUA_MODEL_SCRIPTS) +void luaGetInputs(ScriptInputsOutputs & sid) { - if (!lua_istable(L2, -1)) - return -1; + if (!lua_istable(lsScripts, -1)) + return; memclear(sid.inputs, sizeof(sid.inputs)); sid.inputsCount = 0; - for (lua_pushnil(L2); lua_next(L2, -2); lua_pop(L2, 1)) { - luaL_checktype(L2, -2, LUA_TNUMBER); // key is number - luaL_checktype(L2, -1, LUA_TTABLE); // value is table + for (lua_pushnil(lsScripts); lua_next(lsScripts, -2); lua_pop(lsScripts, 1)) { + luaL_checktype(lsScripts, -2, LUA_TNUMBER); // key is number + luaL_checktype(lsScripts, -1, LUA_TTABLE); // value is table if (sid.inputsCountname = lua_tostring(L, -2); break; case 1: - luaL_checktype(L2, -2, LUA_TNUMBER); // key is number - luaL_checktype(L2, -1, LUA_TNUMBER); // value is number - type = lua_tointeger(L2, -1); + luaL_checktype(lsScripts, -2, LUA_TNUMBER); // key is number + luaL_checktype(lsScripts, -1, LUA_TNUMBER); // value is number + type = lua_tointeger(lsScripts, -1); if (type >= INPUT_TYPE_FIRST && type <= INPUT_TYPE_LAST) { si->type = type; } @@ -177,24 +178,24 @@ int luaGetInputs(lua_State * L2, ScriptInputsOutputs & sid) } break; case 2: - luaL_checktype(L2, -2, LUA_TNUMBER); // key is number - luaL_checktype(L2, -1, LUA_TNUMBER); // value is number + luaL_checktype(lsScripts, -2, LUA_TNUMBER); // key is number + luaL_checktype(lsScripts, -1, LUA_TNUMBER); // value is number if (si->type == INPUT_TYPE_VALUE) { - si->min = lua_tointeger(L2, -1); + si->min = lua_tointeger(lsScripts, -1); } break; case 3: - luaL_checktype(L2, -2, LUA_TNUMBER); // key is number - luaL_checktype(L2, -1, LUA_TNUMBER); // value is number + luaL_checktype(lsScripts, -2, LUA_TNUMBER); // key is number + luaL_checktype(lsScripts, -1, LUA_TNUMBER); // value is number if (si->type == INPUT_TYPE_VALUE) { - si->max = lua_tointeger(L2, -1); + si->max = lua_tointeger(lsScripts, -1); } break; case 4: - luaL_checktype(L2, -2, LUA_TNUMBER); // key is number - luaL_checktype(L2, -1, LUA_TNUMBER); // value is number + luaL_checktype(lsScripts, -2, LUA_TNUMBER); // key is number + luaL_checktype(lsScripts, -1, LUA_TNUMBER); // value is number if (si->type == INPUT_TYPE_VALUE) { - si->def = lua_tointeger(L2, -1); + si->def = lua_tointeger(lsScripts, -1); } break; } @@ -202,19 +203,17 @@ int luaGetInputs(lua_State * L2, ScriptInputsOutputs & sid) sid.inputsCount++; } } - - return 0; } -int luaGetOutputs(lua_State * L2, ScriptInputsOutputs & sid) +void luaGetOutputs(ScriptInputsOutputs & sid) { - if (!lua_istable(L2, -1)) - return -1; + if (!lua_istable(lsScripts, -1)) + return; sid.outputsCount = 0; - for (lua_pushnil(L2); lua_next(L2, -2); ) { - luaL_checktype(L2, -2, LUA_TNUMBER); // key is number - luaL_checktype(L2, -1, LUA_TSTRING); // value is string + for (lua_pushnil(lsScripts); lua_next(lsScripts, -2); ) { + luaL_checktype(lsScripts, -2, LUA_TNUMBER); // key is number + luaL_checktype(lsScripts, -1, LUA_TSTRING); // value is string if (sid.outputsCount < MAX_SCRIPT_OUTPUTS) { lua_xmove(lsScripts, L, 1); // To preserve the string value, move it to the main stack lua_insert(L, -2); // Keep the coroutine at the top of the main stack @@ -222,9 +221,8 @@ int luaGetOutputs(lua_State * L2, ScriptInputsOutputs & sid) } else lua_pop(lsScripts, 1); } - - return 0; } +#endif void luaDisable() { @@ -540,10 +538,12 @@ static const char * getScriptName(uint8_t idx) { int ref = scriptInternalData[idx].reference; +#if defined(LUA_MODEL_SCRIPTS) if (ref <= SCRIPT_MIX_LAST) { return g_model.scriptsData[ref - SCRIPT_MIX_FIRST].file; - } - else if (ref <= SCRIPT_FUNC_LAST) { + } else +#endif + if (ref <= SCRIPT_FUNC_LAST) { return g_model.customFn[ref - SCRIPT_FUNC_FIRST].play.name; } else if (ref <= SCRIPT_GFUNC_LAST) { @@ -571,6 +571,7 @@ static bool luaLoad(const char * filename, ScriptInternalData & sid) return false; } +#if defined(LUA_MODEL_SCRIPTS) static bool luaLoadMixScript(uint8_t ref) { uint8_t idx = ref - SCRIPT_MIX_FIRST; @@ -589,6 +590,7 @@ static bool luaLoadMixScript(uint8_t ref) } return false; } +#endif static bool luaLoadFunctionScript(uint8_t ref) { @@ -610,7 +612,7 @@ static bool luaLoadFunctionScript(uint8_t ref) if (luaScriptsCount < MAX_SCRIPTS) { ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; sid.reference = ref; - + char filename[sizeof(SCRIPTS_FUNCS_PATH) + LEN_FUNCTION_NAME + sizeof(SCRIPT_EXT)] = SCRIPTS_FUNCS_PATH "/"; strncpy(filename + sizeof(SCRIPTS_FUNCS_PATH), fn->play.name, LEN_FUNCTION_NAME); filename[sizeof(SCRIPTS_FUNCS_PATH) + LEN_FUNCTION_NAME] = '\0'; @@ -634,17 +636,17 @@ static bool luaLoadTelemetryScript(uint8_t ref) if (screenType == TELEMETRY_SCREEN_TYPE_SCRIPT) { TelemetryScriptData & script = g_model.screens[idx].script; - + if (ZEXIST(script.file)) { if (luaScriptsCount < MAX_SCRIPTS) { ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; sid.reference = ref; - + char filename[sizeof(SCRIPTS_TELEM_PATH) + LEN_SCRIPT_FILENAME + sizeof(SCRIPT_EXT)] = SCRIPTS_TELEM_PATH "/"; strncpy(filename + sizeof(SCRIPTS_TELEM_PATH), script.file, LEN_SCRIPT_FILENAME); filename[sizeof(SCRIPTS_TELEM_PATH) + LEN_SCRIPT_FILENAME] = '\0'; strcat(filename + sizeof(SCRIPTS_TELEM_PATH), SCRIPT_EXT); - + return luaLoad(filename, sid); } else { @@ -778,7 +780,7 @@ static int luaRegisterFunction(const char * key) { lua_getfield(lsScripts, -1, key); int typ = lua_type(lsScripts, -1); - + if (typ == LUA_TFUNCTION) { return luaL_ref(lsScripts, LUA_REGISTRYINDEX); } @@ -801,7 +803,7 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) if (init) { luaInit(); if (luaState == INTERPRETER_PANIC) return; - + luaLcdAllowed = false; initFunction = LUA_NOREF; luaEmptyEventBuffer(); @@ -811,10 +813,14 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) ref = SCRIPT_STANDALONE; } else { +#if defined(LUA_MODEL_SCRIPTS) ref = SCRIPT_MIX_FIRST; +#else + ref = SCRIPT_FUNC_FIRST; +#endif } } - + // Continue loop with existing reference value do { uint8_t countBefore = luaScriptsCount; @@ -822,10 +828,12 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) // If Lua is not yielded, then find the next script to load if (luaStatus == LUA_OK) { +#if defined(LUA_MODEL_SCRIPTS) if (ref <= SCRIPT_MIX_LAST) { if (luaLoadMixScript(ref)) continue; // If error then skip the rest of the loop - } - else if (ref <= SCRIPT_GFUNC_LAST) { + } else +#endif + if (ref <= SCRIPT_GFUNC_LAST) { if (luaLoadFunctionScript(ref)) continue; } #if defined(PCBTARANIS) @@ -846,15 +854,15 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) // Skip the rest of the loop if we did not get a new script if (countBefore == luaScriptsCount) continue; } - + int idx = luaScriptsCount - 1; ScriptInternalData & sid = scriptInternalData[idx]; - + // 1. run chunk() 2. run init(), if available: do { // Resume running the coroutine luaStatus = lua_resume(lsScripts, 0, 0); - + if (luaStatus == LUA_YIELD) { // Coroutine yielded - wait for the next cycle return; @@ -870,7 +878,7 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) else { // chunk() returned lua_settop(lsScripts, 1); // Only one return value, please - + if (lua_istable(lsScripts, -1)) { // Register functions from the table sid.run = luaRegisterFunction("run"); @@ -880,25 +888,27 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) TRACE_ERROR("luaLoadScripts(%s): No run function\n", getScriptName(idx)); sid.state = SCRIPT_SYNTAX_ERROR; } +#if defined(LUA_MODEL_SCRIPTS) // Get input/output tables for mixer scripts if (ref <= SCRIPT_MIX_LAST) { ScriptInputsOutputs * sio = & scriptInputsOutputs[idx]; lua_getfield(lsScripts, -1, "input"); - luaGetInputs(lsScripts, *sio); + luaGetInputs(*sio); lua_pop(lsScripts, 1); lua_getfield(lsScripts, -1, "output"); - luaGetOutputs(lsScripts, *sio); + luaGetOutputs(*sio); lua_pop(lsScripts, 1); } +#endif } else { TRACE_ERROR("luaLoadScripts(%s): The script did not return a table\n", getScriptName(idx)); sid.state = SCRIPT_SYNTAX_ERROR; } - + // Pop the table off the stack lua_pop(lsScripts, 1); - + // If init(), push it on the stack if (initFunction != LUA_NOREF) { lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, initFunction); @@ -914,7 +924,7 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) TRACE_ERROR("luaLoadScripts(%s): init function: %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); else TRACE_ERROR("luaLoadScripts(%s): %s\n", getScriptName(idx), lua_tostring(lsScripts, -1)); - + if (ref == SCRIPT_STANDALONE) { luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; luaError(lsScripts, sid.state, true); @@ -925,13 +935,13 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) lua_pop(L, 1); // Pop the dead coroutine off the main stack lsScripts = lua_newthread(L); // Push the new coroutine } - + luaDoGc(lsScripts, true); - + } while(initFunction != LUA_NOREF); - + } while(++ref < SCRIPT_STANDALONE); - + // Loading has finished - start running scripts luaState = INTERPRETER_START_RUNNING; } // luaLoadScripts @@ -951,7 +961,7 @@ static bool resumeLua(bool init, bool allowLcdUsage) bool scriptWasRun = false; bool fullGC = !allowLcdUsage; static uint8_t luaDisplayStatistics = false; - + // Run in the right interactive mode if (allowLcdUsage != luaLcdAllowed) { #if defined(PCBTARANIS) @@ -963,11 +973,11 @@ static bool resumeLua(bool init, bool allowLcdUsage) #endif return scriptWasRun; } - + do { ScriptInternalData & sid = scriptInternalData[idx]; if (sid.state != SCRIPT_OK) continue; - + uint8_t ref = sid.reference; int inputsCount = 0; int luaStatus = lua_status(lsScripts); @@ -975,7 +985,7 @@ static bool resumeLua(bool init, bool allowLcdUsage) if (luaStatus == LUA_OK) { // Not preempted - setup another function call lua_settop(lsScripts, 0); - + if (allowLcdUsage) { #if defined(PCBTARANIS) if ((menuHandlers[menuLevel] == menuViewTelemetry && ref == SCRIPT_TELEMETRY_FIRST + s_frsky_view) || ref == SCRIPT_STANDALONE) { @@ -986,7 +996,7 @@ static bool resumeLua(bool init, bool allowLcdUsage) evt = events[0]; events[0] = events[1]; events[1] = 0; - + lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); lua_pushunsigned(lsScripts, evt); inputsCount = 1; @@ -994,28 +1004,30 @@ static bool resumeLua(bool init, bool allowLcdUsage) else continue; } else { +#if defined(LUA_MODEL_SCRIPTS) if (ref <= SCRIPT_MIX_LAST) { lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); - + ScriptData & sd = g_model.scriptsData[ref - SCRIPT_MIX_FIRST]; ScriptInputsOutputs * sio = & scriptInputsOutputs[ref - SCRIPT_MIX_FIRST]; inputsCount = sio -> inputsCount; - + for (int j = 0; j < inputsCount; j++) { if (sio -> inputs[j].type == INPUT_TYPE_SOURCE) luaGetValueAndPush(lsScripts, sd.inputs[j].source); else lua_pushinteger(lsScripts, sd.inputs[j].value + sio -> inputs[j].def); } - } - else if (ref <= SCRIPT_GFUNC_LAST) { + } else +#endif + if (ref <= SCRIPT_GFUNC_LAST) { CustomFunctionData * fn; - + if (ref <= SCRIPT_FUNC_LAST) fn = &g_model.customFn[ref - SCRIPT_FUNC_FIRST]; else fn = &g_eeGeneral.customFn[ref - SCRIPT_GFUNC_FIRST]; - + if (getSwitch(fn -> swtch)) { lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); } @@ -1048,7 +1060,8 @@ static bool resumeLua(bool init, bool allowLcdUsage) else if (luaStatus == LUA_OK) { // Coroutine returned scriptWasRun = true; - + +#if defined(LUA_MODEL_SCRIPTS) if (ref <= SCRIPT_MIX_LAST) { ScriptInputsOutputs * sio = & scriptInputsOutputs[ref - SCRIPT_MIX_FIRST]; lua_settop(lsScripts, sio -> outputsCount); @@ -1062,13 +1075,14 @@ static bool resumeLua(bool init, bool allowLcdUsage) sio -> outputs[j].value = lua_tointeger(lsScripts, -1); lua_pop(lsScripts, 1); } - } - else if (ref == SCRIPT_STANDALONE) { + } else +#endif + if (ref == SCRIPT_STANDALONE) { lua_settop(lsScripts, 1); if (lua_isnumber(lsScripts, -1)) { int scriptResult = lua_tointeger(lsScripts, -1); lua_pop(lsScripts, 1); /* pop returned value */ - + if (scriptResult != 0) { TRACE("Script finished with status %d", scriptResult); sid.state = SCRIPT_FINISHED; @@ -1096,7 +1110,7 @@ static bool resumeLua(bool init, bool allowLcdUsage) TRACE_ERROR("Script run function returned unexpected value\n"); sid.state = SCRIPT_SYNTAX_ERROR; } - + if (evt == EVT_KEY_LONG(KEY_EXIT)) { TRACE("Script force exit"); killEvents(evt); @@ -1126,7 +1140,7 @@ static bool resumeLua(bool init, bool allowLcdUsage) lsScripts = lua_newthread(L); // Push the new coroutine } } - + if (sid.state != SCRIPT_OK) { if (sid.reference == SCRIPT_STANDALONE) { luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS; @@ -1135,11 +1149,11 @@ static bool resumeLua(bool init, bool allowLcdUsage) else luaFree(lsScripts, sid); } } while (++idx < luaScriptsCount); - + // Toggle between background and foreground scripts luaLcdAllowed = !luaLcdAllowed; idx = 0; - + return scriptWasRun; } //resumeLua(...) @@ -1148,16 +1162,16 @@ bool luaTask(event_t evt, bool allowLcdUsage) { bool init = false; bool scriptWasRun = false; - + // Add event to buffer if (evt != 0) { if (events[0] == 0) events[0] = evt; else if (events[1] == 0) events[1] = evt; } - + // For preemption if (!allowLcdUsage) luaCycleStart = get_tmr10ms(); - + // Trying to replace CPU usage measure instructionsPercent = 100 * maxLuaDuration / LUA_TASK_PERIOD_TICKS; @@ -1165,7 +1179,7 @@ bool luaTask(event_t evt, bool allowLcdUsage) case INTERPRETER_RELOAD_PERMANENT_SCRIPTS: init = true; luaState = INTERPRETER_LOADING; - + case INTERPRETER_LOADING: PROTECT_LUA() { luaLoadScripts(init); @@ -1173,11 +1187,11 @@ bool luaTask(event_t evt, bool allowLcdUsage) else luaDisable(); UNPROTECT_LUA(); break; - + case INTERPRETER_START_RUNNING: init = true; luaState = INTERPRETER_RUNNING; - + case INTERPRETER_RUNNING: PROTECT_LUA() { scriptWasRun = resumeLua(init, allowLcdUsage); @@ -1244,7 +1258,7 @@ void luaInit() // lsScripts is now a coroutine in lieu of the main thread to support preemption lsScripts = lua_newthread(L); - + // Clear loaded scripts memset(scriptInternalData, 0, sizeof(scriptInternalData)); memset(scriptInputsOutputs, 0, sizeof(scriptInputsOutputs)); diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 30626eaba..ca0d9c294 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -111,8 +111,10 @@ enum ScriptState { }; enum ScriptReference { +#if defined(LUA_MODEL_SCRIPTS) SCRIPT_MIX_FIRST, SCRIPT_MIX_LAST=SCRIPT_MIX_FIRST+MAX_SCRIPTS-1, +#endif SCRIPT_FUNC_FIRST, SCRIPT_FUNC_LAST=SCRIPT_FUNC_FIRST+MAX_SPECIAL_FUNCTIONS-1, // model functions SCRIPT_GFUNC_FIRST, From b0732e156406017e30b6f20cd19dd02034996a62 Mon Sep 17 00:00:00 2001 From: jfrickmann Date: Wed, 14 Jul 2021 15:49:27 -0400 Subject: [PATCH 15/18] Don't kill the mixer scripts - just preempt them :-) --- radio/src/gui/colorlcd/model_mixer_scripts.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/radio/src/gui/colorlcd/model_mixer_scripts.cpp b/radio/src/gui/colorlcd/model_mixer_scripts.cpp index 0e0fd012a..dec877b7b 100644 --- a/radio/src/gui/colorlcd/model_mixer_scripts.cpp +++ b/radio/src/gui/colorlcd/model_mixer_scripts.cpp @@ -167,7 +167,6 @@ class ScriptEditWindow : public Page { }; constexpr char SCRIPT_STATUS_ERROR[] = "(error)"; -constexpr char SCRIPT_STATUS_KILLED[] = "(killed)"; class ScriptLineButton : public Button { @@ -204,10 +203,6 @@ class ScriptLineButton : public Button dc->drawSizedText(x, y, SCRIPT_STATUS_ERROR, sizeof(SCRIPT_STATUS_ERROR), textColor); break; - case SCRIPT_KILLED: - dc->drawSizedText(x, y, SCRIPT_STATUS_KILLED, - sizeof(SCRIPT_STATUS_KILLED), textColor); - break; default: dc->drawNumber(x, y, runtimeData->instructions, textColor, 0, nullptr, "%"); break; From 9366abab32ab5abb559de1c90939713c142534b2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 24 Jul 2021 11:49:59 +0200 Subject: [PATCH 16/18] Removed SD card version check --- radio/src/opentx.cpp | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 4d014785b..f59c4fa6d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -650,32 +650,6 @@ void doSplash() #define doSplash() #endif -#if defined(SDCARD) -void checkSDVersion() -{ - if (sdMounted()) { - FIL versionFile; - UINT read = 0; - char version[sizeof(REQUIRED_SDCARD_VERSION)-1]; - char error[sizeof(TR_WRONG_SDCARDVERSION)+ sizeof(version)]; - - strAppend(strAppend(error, STR_WRONG_SDCARDVERSION, sizeof(TR_WRONG_SDCARDVERSION)), REQUIRED_SDCARD_VERSION, sizeof(REQUIRED_SDCARD_VERSION)); - FRESULT result = f_open(&versionFile, "/edgetx.sdcard.version", FA_OPEN_EXISTING | FA_READ); - if (result == FR_OK) { - if (f_read(&versionFile, &version, sizeof(version), &read) != FR_OK || - read != sizeof(version) || - strncmp(version, REQUIRED_SDCARD_VERSION, sizeof(version)) != 0) { - TRACE("SD card version mismatch: %.*s, %s", sizeof(REQUIRED_SDCARD_VERSION)-1, version, REQUIRED_SDCARD_VERSION); - ALERT(STR_SD_CARD, error, AU_ERROR); - } - f_close(&versionFile); - } - else { - ALERT(STR_SD_CARD, error, AU_ERROR); - } - } -} -#endif #if defined(MULTIMODULE) void checkMultiLowPower() @@ -734,9 +708,6 @@ void checkAll() checkSwitches(); checkFailsafe(); -#if defined(SDCARD) && !defined(RADIOMASTER_RTF_RELEASE) - checkSDVersion(); -#endif #if defined(STM32) if (isVBatBridgeEnabled() && !g_eeGeneral.disableRtcWarning) { From a0931394896d7cd69aac7afa7ef511d757556806 Mon Sep 17 00:00:00 2001 From: zyren <585668@qq.com> Date: Sun, 25 Jul 2021 22:46:31 +0800 Subject: [PATCH 17/18] Modify external RF SBUS voltage warning The SBUS out is battery voltage --- radio/src/gui/colorlcd/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/model_setup.cpp b/radio/src/gui/colorlcd/model_setup.cpp index f045fabfc..e79628b91 100644 --- a/radio/src/gui/colorlcd/model_setup.cpp +++ b/radio/src/gui/colorlcd/model_setup.cpp @@ -1050,7 +1050,7 @@ class ModuleWindow : public FormGroup { new Choice(this, grid.getFieldSlot(2, 1), STR_SBUS_INVERSION_VALUES, 0, 1, GET_SET_DEFAULT(g_model.moduleData[moduleIdx].sbus.noninverted)); #if defined(RADIO_TX16S) grid.nextLine(); - new StaticText(this, grid.getFieldSlot(1, 0), STR_WARN_5VOLTS); + new StaticText(this, grid.getFieldSlot(1, 0), STR_WARN_BATTVOLTAGE, 0, ALARM_COLOR); #endif grid.nextLine(); } From 7cc958e27d9ff18c78bba6fba9aa099e096c8812 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 25 Jul 2021 17:37:22 +0200 Subject: [PATCH 18/18] Revert "Modify external RF SBUS voltage warning" This reverts commit a0931394896d7cd69aac7afa7ef511d757556806. --- radio/src/gui/colorlcd/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/model_setup.cpp b/radio/src/gui/colorlcd/model_setup.cpp index e79628b91..f045fabfc 100644 --- a/radio/src/gui/colorlcd/model_setup.cpp +++ b/radio/src/gui/colorlcd/model_setup.cpp @@ -1050,7 +1050,7 @@ class ModuleWindow : public FormGroup { new Choice(this, grid.getFieldSlot(2, 1), STR_SBUS_INVERSION_VALUES, 0, 1, GET_SET_DEFAULT(g_model.moduleData[moduleIdx].sbus.noninverted)); #if defined(RADIO_TX16S) grid.nextLine(); - new StaticText(this, grid.getFieldSlot(1, 0), STR_WARN_BATTVOLTAGE, 0, ALARM_COLOR); + new StaticText(this, grid.getFieldSlot(1, 0), STR_WARN_5VOLTS); #endif grid.nextLine(); }