You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.8 KiB
73 lines
1.8 KiB
/*
|
|
* 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
|
|
|