split the lua thread registry into its own files

custom
jacqueline 1 year ago
parent 4b2003c78a
commit f9aec8b690
  1. 2
      src/app_console/app_console.cpp
  2. 2
      src/lua/CMakeLists.txt
  3. 51
      src/lua/include/lua_registry.hpp
  4. 34
      src/lua/include/lua_thread.hpp
  5. 3
      src/lua/lua_queue.cpp
  6. 47
      src/lua/lua_thread.cpp
  7. 73
      src/lua/registry.cpp
  8. 1
      src/ui/ui_fsm.cpp

@ -40,7 +40,7 @@
#include "freertos/projdefs.h"
#include "haptics.hpp"
#include "index.hpp"
#include "lua_thread.hpp"
#include "lua_registry.hpp"
#include "memory_resource.hpp"
#include "samd.hpp"
#include "service_locator.hpp"

@ -4,7 +4,7 @@
idf_component_register(
SRCS "lua_thread.cpp" "bridge.cpp" "property.cpp" "lua_database.cpp"
"lua_queue.cpp" "lua_version.cpp" "lua_controls.cpp"
"lua_queue.cpp" "lua_version.cpp" "lua_controls.cpp" "registry.cpp"
INCLUDE_DIRS "include"
REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database"
"esp_timer" "battery" "esp-idf-lua" "luavgl" "lua-linenoise" "lua-term"

@ -0,0 +1,51 @@
/*
* Copyright 2023 jacqueline <me@jacqueline.id.au>
*
* SPDX-License-Identifier: GPL-3.0-only
*/
#pragma once
#include <memory>
#include <string>
#include "lua.hpp"
#include "bridge.hpp"
#include "lua_thread.hpp"
#include "service_locator.hpp"
namespace lua {
class Registry {
public:
static auto instance(system_fsm::ServiceLocator&) -> Registry&;
auto uiThread() -> std::shared_ptr<LuaThread>;
auto newThread() -> std::shared_ptr<LuaThread>;
auto AddPropertyModule(
const std::string&,
std::vector<std::pair<std::string, std::variant<LuaFunction, Property*>>>)
-> void;
Registry(const Registry&) = delete;
Registry& operator=(const Registry&) = delete;
private:
Registry(system_fsm::ServiceLocator&);
system_fsm::ServiceLocator& services_;
std::unique_ptr<Bridge> bridge_;
std::shared_ptr<LuaThread> ui_thread_;
std::list<std::weak_ptr<LuaThread>> threads_;
std::vector<
std::pair<std::string,
std::vector<std::pair<std::string,
std::variant<LuaFunction, Property*>>>>>
modules_;
};
} // namespace lua

@ -10,9 +10,7 @@
#include <string>
#include "lua.hpp"
#include "lvgl.h"
#include "bridge.hpp"
#include "service_locator.hpp"
namespace lua {
@ -43,36 +41,4 @@ class LuaThread {
lua_State* state_;
};
class Registry {
public:
static auto instance(system_fsm::ServiceLocator&) -> Registry&;
auto uiThread() -> std::shared_ptr<LuaThread>;
auto newThread() -> std::shared_ptr<LuaThread>;
auto AddPropertyModule(
const std::string&,
std::vector<
std::pair<std::string, std::variant<LuaFunction, Property*>>>)
-> void;
Registry(const Registry&) = delete;
Registry& operator=(const Registry&) = delete;
private:
Registry(system_fsm::ServiceLocator&);
system_fsm::ServiceLocator& services_;
std::unique_ptr<Bridge> bridge_;
std::shared_ptr<LuaThread> ui_thread_;
std::list<std::weak_ptr<LuaThread>> threads_;
std::vector<
std::pair<std::string,
std::vector<std::pair<std::string,
std::variant<LuaFunction, Property*>>>>>
modules_;
};
} // namespace lua

@ -16,6 +16,7 @@
#include "lua.h"
#include "lvgl.h"
#include "bridge.hpp"
#include "database.hpp"
#include "event_queue.hpp"
#include "index.hpp"
@ -70,4 +71,4 @@ auto RegisterQueueModule(lua_State* s) -> void {
lua_pop(s, 1);
}
} // namespace lua
} // namespace lua

@ -184,51 +184,4 @@ auto CallProtected(lua_State* s, int nargs, int nresults) -> int {
return ret;
}
auto Registry::instance(system_fsm::ServiceLocator& s) -> Registry& {
static Registry sRegistry{s};
return sRegistry;
}
Registry::Registry(system_fsm::ServiceLocator& services)
: services_(services), bridge_(new Bridge(services)) {}
auto Registry::uiThread() -> std::shared_ptr<LuaThread> {
if (!ui_thread_) {
ui_thread_ = newThread();
bridge_->installLvgl(ui_thread_->state());
}
return ui_thread_;
}
auto Registry::newThread() -> std::shared_ptr<LuaThread> {
std::shared_ptr<LuaThread> thread{LuaThread::Start(services_)};
bridge_->installBaseModules(thread->state());
for (auto& module : modules_) {
bridge_->installPropertyModule(thread->state(), module.first,
module.second);
}
threads_.push_back(thread);
return thread;
}
auto Registry::AddPropertyModule(
const std::string& name,
std::vector<std::pair<std::string, std::variant<LuaFunction, Property*>>>
properties) -> void {
modules_.push_back(std::make_pair(name, properties));
// Any live threads will need to be updated to include the new module.
auto it = threads_.begin();
while (it != threads_.end()) {
auto thread = it->lock();
if (!thread) {
// Thread has been destroyed; stop tracking it.
it = threads_.erase(it);
} else {
bridge_->installPropertyModule(thread->state(), name, properties);
it++;
}
}
}
} // namespace lua

@ -0,0 +1,73 @@
/*
* Copyright 2023 jacqueline <me@jacqueline.id.au>
*
* SPDX-License-Identifier: GPL-3.0-only
*/
#include "lua_registry.hpp"
#include <iostream>
#include <memory>
#include "esp_heap_caps.h"
#include "esp_log.h"
#include "lua.hpp"
#include "bridge.hpp"
#include "event_queue.hpp"
#include "memory_resource.hpp"
#include "service_locator.hpp"
#include "ui_events.hpp"
namespace lua {
[[maybe_unused]] static constexpr char kTag[] = "lua";
auto Registry::instance(system_fsm::ServiceLocator& s) -> Registry& {
static Registry sRegistry{s};
return sRegistry;
}
Registry::Registry(system_fsm::ServiceLocator& services)
: services_(services), bridge_(new Bridge(services)) {}
auto Registry::uiThread() -> std::shared_ptr<LuaThread> {
if (!ui_thread_) {
ui_thread_ = newThread();
bridge_->installLvgl(ui_thread_->state());
}
return ui_thread_;
}
auto Registry::newThread() -> std::shared_ptr<LuaThread> {
std::shared_ptr<LuaThread> thread{LuaThread::Start(services_)};
bridge_->installBaseModules(thread->state());
for (auto& module : modules_) {
bridge_->installPropertyModule(thread->state(), module.first,
module.second);
}
threads_.push_back(thread);
return thread;
}
auto Registry::AddPropertyModule(
const std::string& name,
std::vector<std::pair<std::string, std::variant<LuaFunction, Property*>>>
properties) -> void {
modules_.push_back(std::make_pair(name, properties));
// Any live threads will need to be updated to include the new module.
auto it = threads_.begin();
while (it != threads_.end()) {
auto thread = it->lock();
if (!thread) {
// Thread has been destroyed; stop tracking it.
it = threads_.erase(it);
} else {
bridge_->installPropertyModule(thread->state(), name, properties);
it++;
}
}
}
} // namespace lua

@ -36,6 +36,7 @@
#include "encoder_input.hpp"
#include "event_queue.hpp"
#include "gpios.hpp"
#include "lua_registry.hpp"
#include "lvgl_task.hpp"
#include "nvs.hpp"
#include "property.hpp"

Loading…
Cancel
Save