diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-05-02 19:12:26 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-05-02 19:12:26 +1000 |
| commit | 1573a8c4cde1cd9528b422b2dcc598e37ffe94a7 (patch) | |
| tree | d162822b8fd7054f81bace0c7a65ab4d5e6f93ef /src/tangara/ui/lvgl_task.cpp | |
| parent | a231fd1c8afedbeb14b0bc77d76bad61db986059 (diff) | |
| download | tangara-fw-1573a8c4cde1cd9528b422b2dcc598e37ffe94a7.tar.gz | |
WIP merge cyclically dependent components into one big component
Diffstat (limited to 'src/tangara/ui/lvgl_task.cpp')
| -rw-r--r-- | src/tangara/ui/lvgl_task.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
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 <me@jacqueline.id.au> + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "lvgl_task.hpp" + +#include <dirent.h> +#include <stdint.h> +#include <stdio.h> + +#include <cstddef> +#include <cstdint> +#include <memory> + +#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> 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<TickType_t>(delay, 0, 100))); + } +} + +auto UiTask::input(std::shared_ptr<input::LvglInputDriver> input) -> void { + input_ = input; +} + +auto UiTask::Start() -> UiTask* { + UiTask* ret = new UiTask(); + tasks::StartPersistent<tasks::Type::kUi>([=]() { ret->Main(); }); + return ret; +} + +} // namespace ui |
