From 1573a8c4cde1cd9528b422b2dcc598e37ffe94a7 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 19:12:26 +1000 Subject: WIP merge cyclically dependent components into one big component --- src/tangara/ui/lvgl_task.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/tangara/ui/lvgl_task.cpp (limited to 'src/tangara/ui/lvgl_task.cpp') diff --git a/src/tangara/ui/lvgl_task.cpp b/src/tangara/ui/lvgl_task.cpp new file mode 100644 index 00000000..51da0179 --- /dev/null +++ b/src/tangara/ui/lvgl_task.cpp @@ -0,0 +1,96 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "lvgl_task.hpp" + +#include +#include +#include + +#include +#include +#include + +#include "core/lv_disp.h" +#include "core/lv_group.h" +#include "core/lv_indev.h" +#include "core/lv_obj.h" +#include "core/lv_obj_pos.h" +#include "core/lv_obj_tree.h" +#include "esp_log.h" +#include "event_queue.hpp" +#include "extra/themes/basic/lv_theme_basic.h" +#include "font/lv_font.h" +#include "freertos/portmacro.h" +#include "freertos/projdefs.h" +#include "freertos/timers.h" +#include "hal/gpio_types.h" +#include "hal/lv_hal_indev.h" +#include "hal/spi_types.h" +#include "lua.h" +#include "lv_api_map.h" +#include "lvgl/lvgl.h" +#include "lvgl_input_driver.hpp" +#include "misc/lv_color.h" +#include "misc/lv_style.h" +#include "misc/lv_timer.h" +#include "modal.hpp" +#include "tasks.hpp" +#include "touchwheel.hpp" +#include "ui_fsm.hpp" +#include "widgets/lv_label.h" + +#include "display.hpp" +#include "gpios.hpp" + +namespace ui { + +[[maybe_unused]] static const char* kTag = "ui_task"; + +UiTask::UiTask() {} + +UiTask::~UiTask() { + assert(false); +} + +auto UiTask::Main() -> void { + ESP_LOGI(kTag, "start ui task"); + lv_group_t* current_group = nullptr; + auto* events = events::queues::Ui(); + while (true) { + while (events->Service(0)) { + } + + std::shared_ptr screen = UiState::current_screen(); + if (screen != current_screen_ && screen != nullptr) { + lv_scr_load(screen->root()); + if (input_) { + lv_indev_set_group(input_->registration(), screen->group()); + } + current_screen_ = screen; + } + + if (input_ && current_screen_->group() != current_group) { + current_group = current_screen_->group(); + lv_indev_set_group(input_->registration(), current_group); + } + + TickType_t delay = lv_timer_handler(); + vTaskDelay(pdMS_TO_TICKS(std::clamp(delay, 0, 100))); + } +} + +auto UiTask::input(std::shared_ptr input) -> void { + input_ = input; +} + +auto UiTask::Start() -> UiTask* { + UiTask* ret = new UiTask(); + tasks::StartPersistent([=]() { ret->Main(); }); + return ret; +} + +} // namespace ui -- cgit v1.2.3