move lua ui-related data to spi ram

custom
jacqueline 1 year ago
parent ea8a7b0f93
commit c1b7a0c9f2
  1. 9
      lib/luavgl/src/event.c
  2. 10
      src/ui/ui_fsm.cpp

@ -1,6 +1,8 @@
#include "luavgl.h" #include "luavgl.h"
#include "private.h" #include "private.h"
#include "esp_heap_caps.h"
static void luavgl_obj_event_cb(lv_event_t *e) static void luavgl_obj_event_cb(lv_event_t *e)
{ {
lua_State *L = e->user_data; lua_State *L = e->user_data;
@ -102,7 +104,8 @@ static int luavgl_obj_on_event(lua_State *L)
/* create obj->lobj->events, if NULL, realloc if existing and find no slot /* create obj->lobj->events, if NULL, realloc if existing and find no slot
*/ */
if (events == NULL) { if (events == NULL) {
events = calloc(sizeof(struct event_callback_s), 1); events =
heap_caps_calloc(sizeof(struct event_callback_s), 1, MALLOC_CAP_SPIRAM);
if (events == NULL) { if (events == NULL) {
return luaL_error(L, "No memory."); return luaL_error(L, "No memory.");
} }
@ -113,7 +116,9 @@ static int luavgl_obj_on_event(lua_State *L)
/* realloc? */ /* realloc? */
if (slot && slot == lobj->n_events) { if (slot && slot == lobj->n_events) {
struct event_callback_s *_events; struct event_callback_s *_events;
_events = realloc(lobj->events, (lobj->n_events + 1) * sizeof(*_events)); _events = heap_caps_realloc(lobj->events,
(lobj->n_events + 1) * sizeof(*_events),
MALLOC_CAP_SPIRAM);
if (_events == NULL) { if (_events == NULL) {
return luaL_error(L, "No memory."); return luaL_error(L, "No memory.");
} }

@ -7,6 +7,7 @@
#include "ui_fsm.hpp" #include "ui_fsm.hpp"
#include <memory> #include <memory>
#include <memory_resource>
#include <variant> #include <variant>
#include "bluetooth_types.hpp" #include "bluetooth_types.hpp"
@ -26,6 +27,7 @@
#include "lauxlib.h" #include "lauxlib.h"
#include "lua_thread.hpp" #include "lua_thread.hpp"
#include "luavgl.h" #include "luavgl.h"
#include "memory_resource.hpp"
#include "misc/lv_gc.h" #include "misc/lv_gc.h"
#include "audio_events.hpp" #include "audio_events.hpp"
@ -449,8 +451,12 @@ auto Lua::PushLuaScreen(lua_State* s) -> int {
luaL_checktype(s, 1, LUA_TFUNCTION); luaL_checktype(s, 1, LUA_TFUNCTION);
// First, create a new plain old Screen object. We will use its root and // First, create a new plain old Screen object. We will use its root and
// group for the Lua screen. // group for the Lua screen. Allocate it in external ram so that arbitrarily
auto new_screen = std::make_shared<screens::Lua>(); // deep screen stacks don't cause too much memory pressure.
auto new_screen =
std::allocate_shared<screens::Lua,
std::pmr::polymorphic_allocator<screens::Lua>>(
&memory::kSpiRamResource);
// Tell lvgl about the new roots. // Tell lvgl about the new roots.
luavgl_set_root(s, new_screen->content()); luavgl_set_root(s, new_screen->content());

Loading…
Cancel
Save