From daa3013836d619d920db3a9dc1f9cc988047a4b4 Mon Sep 17 00:00:00 2001 From: ailurux Date: Sat, 8 Jul 2023 12:57:55 +1000 Subject: [PATCH 1/3] Touchwheel ticks :) --- src/drivers/relative_wheel.cpp | 40 +++++++++++++++------------------- src/ui/wheel_encoder.cpp | 18 ++++----------- 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/src/drivers/relative_wheel.cpp b/src/drivers/relative_wheel.cpp index a631cd2e..de982d5a 100644 --- a/src/drivers/relative_wheel.cpp +++ b/src/drivers/relative_wheel.cpp @@ -27,8 +27,15 @@ auto RelativeWheel::Update() -> void { is_clicking_ = d.is_button_touched; + if (is_clicking_) { + ticks_ = 0; + return; + } + if (!d.is_wheel_touched) { + ticks_ = 0; is_first_read_ = true; + return; } uint8_t new_angle = d.wheel_position; @@ -38,33 +45,20 @@ auto RelativeWheel::Update() -> void { return; } - // Work out the magnitude of travel. - uint8_t change_cw = last_angle_ - new_angle; - uint8_t change_ccw = new_angle - last_angle_; - int change = std::min(change_cw, change_ccw); + int delta = 128 - last_angle_; + uint8_t rotated_angle = new_angle + delta; + int threshold = 20; - last_angle_ = new_angle; - - // Round to eliminate noise. - if (change <= 2) { + if (rotated_angle < 128 - threshold) { + ticks_ = 1; + last_angle_ = new_angle; + } else if (rotated_angle > 128 + threshold) { + ticks_ = -1; + last_angle_ = new_angle; + } else { ticks_ = 0; - return; - } - - // Quantize into ticks. - change /= 4; - - // Clamp to reliminate more noise. - if (change > 10) { - change = 0; - } - - // Work out the direction of travel. - if (change_cw > change_ccw) { - change *= -1; } - ticks_ = change; } auto RelativeWheel::is_clicking() -> bool { diff --git a/src/ui/wheel_encoder.cpp b/src/ui/wheel_encoder.cpp index 243772d7..a0e12b7f 100644 --- a/src/ui/wheel_encoder.cpp +++ b/src/ui/wheel_encoder.cpp @@ -25,7 +25,7 @@ TouchWheelEncoder::TouchWheelEncoder( std::weak_ptr wheel) : last_key_(0), wheel_(wheel) { lv_indev_drv_init(&driver_); - driver_.type = LV_INDEV_TYPE_KEYPAD; + driver_.type = LV_INDEV_TYPE_ENCODER; driver_.read_cb = encoder_read; // driver_.feedback_cb = encoder_feedback; driver_.user_data = this; @@ -41,19 +41,9 @@ auto TouchWheelEncoder::Read(lv_indev_data_t* data) -> void { lock->Update(); - auto ticks = lock->ticks(); - if (ticks > 0) { - data->key = LV_KEY_PREV; - data->state = LV_INDEV_STATE_PRESSED; - } else if (ticks < 0) { - data->key = LV_KEY_NEXT; - data->state = LV_INDEV_STATE_PRESSED; - } else if (lock->is_clicking()) { - data->key = LV_KEY_ENTER; - data->state = LV_INDEV_STATE_PRESSED; - } else { - data->state = LV_INDEV_STATE_RELEASED; - } + data->enc_diff = lock->ticks(); + data->state = + lock->is_clicking() ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; } } // namespace ui From 22221ae4f66404644ca748d7ce59c0fa5325032d Mon Sep 17 00:00:00 2001 From: ailurux Date: Sat, 8 Jul 2023 12:59:17 +1000 Subject: [PATCH 2/3] Blue menu indicator --- src/ui/screen_menu.cpp | 1 + src/ui/screen_track_browser.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/ui/screen_menu.cpp b/src/ui/screen_menu.cpp index 743dc6fa..91e79dd5 100644 --- a/src/ui/screen_menu.cpp +++ b/src/ui/screen_menu.cpp @@ -43,6 +43,7 @@ Menu::Menu(std::vector indexes) : indexes_(indexes) { for (database::IndexInfo& index : indexes_) { lv_obj_t* item = lv_list_add_btn(list, NULL, index.name.c_str()); + lv_obj_set_style_bg_color(item, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN | LV_STATE_FOCUSED); lv_obj_add_event_cb(item, item_click_cb, LV_EVENT_CLICKED, &index); lv_group_add_obj(group_, item); } diff --git a/src/ui/screen_track_browser.cpp b/src/ui/screen_track_browser.cpp index 93ca277e..38a361bf 100644 --- a/src/ui/screen_track_browser.cpp +++ b/src/ui/screen_track_browser.cpp @@ -165,6 +165,7 @@ auto TrackBrowser::AddResults(Position pos, text = "[ no data ]"; } lv_obj_t* item = lv_list_add_btn(list_, NULL, text->c_str()); + lv_obj_set_style_bg_color(item, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN | LV_STATE_FOCUSED); lv_obj_add_event_cb(item, item_click_cb, LV_EVENT_CLICKED, this); lv_obj_add_event_cb(item, item_select_cb, LV_EVENT_FOCUSED, this); lv_group_add_obj(group_, item); From d1d4b4a1ab63e9db9c8fc03e1c95fe732c37a0c2 Mon Sep 17 00:00:00 2001 From: ailurux Date: Sat, 8 Jul 2023 16:40:49 +1000 Subject: [PATCH 3/3] Add theme class --- src/drivers/relative_wheel.cpp | 2 +- src/ui/CMakeLists.txt | 2 +- src/ui/include/lvgl_task.hpp | 1 + src/ui/include/themes.hpp | 18 ++++++++++++++++ src/ui/lvgl_task.cpp | 6 ++++-- src/ui/screen_menu.cpp | 1 - src/ui/screen_track_browser.cpp | 1 - src/ui/themes.cpp | 37 +++++++++++++++++++++++++++++++++ 8 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 src/ui/include/themes.hpp create mode 100644 src/ui/themes.cpp diff --git a/src/drivers/relative_wheel.cpp b/src/drivers/relative_wheel.cpp index de982d5a..74b1e022 100644 --- a/src/drivers/relative_wheel.cpp +++ b/src/drivers/relative_wheel.cpp @@ -47,7 +47,7 @@ auto RelativeWheel::Update() -> void { int delta = 128 - last_angle_; uint8_t rotated_angle = new_angle + delta; - int threshold = 20; + int threshold = 15; if (rotated_angle < 128 - threshold) { ticks_ = 1; diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index d58cdaf2..9efbc6e9 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-only idf_component_register( - SRCS "lvgl_task.cpp" "ui_fsm.cpp" "screen_splash.cpp" "screen_menu.cpp" "wheel_encoder.cpp" "screen_track_browser.cpp" "screen_playing.cpp" "splash.c" + SRCS "lvgl_task.cpp" "ui_fsm.cpp" "screen_splash.cpp" "screen_menu.cpp" "wheel_encoder.cpp" "screen_track_browser.cpp" "screen_playing.cpp" "themes.cpp" "splash.c" INCLUDE_DIRS "include" REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database" "esp_timer") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/ui/include/lvgl_task.hpp b/src/ui/include/lvgl_task.hpp index 8e387683..c649c4b6 100644 --- a/src/ui/include/lvgl_task.hpp +++ b/src/ui/include/lvgl_task.hpp @@ -16,6 +16,7 @@ #include "display.hpp" #include "relative_wheel.hpp" #include "touchwheel.hpp" +#include "themes.hpp" namespace ui { diff --git a/src/ui/include/themes.hpp b/src/ui/include/themes.hpp new file mode 100644 index 00000000..9af80c0d --- /dev/null +++ b/src/ui/include/themes.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "lvgl.h" + +namespace ui { +namespace themes { +class Theme { + public: + Theme(); + void Apply(void); + void Callback(lv_obj_t* obj); + + private: + lv_style_t button_style_; + lv_theme_t theme_; +}; +} // namespace themes +} // namespace ui \ No newline at end of file diff --git a/src/ui/lvgl_task.cpp b/src/ui/lvgl_task.cpp index 853b3280..f746734f 100644 --- a/src/ui/lvgl_task.cpp +++ b/src/ui/lvgl_task.cpp @@ -54,8 +54,10 @@ void LvglMain(std::weak_ptr weak_touch_wheel, ESP_LOGI(kTag, "init lvgl"); lv_init(); - lv_theme_t* theme = lv_theme_basic_init(NULL); - lv_disp_set_theme(NULL, theme); + lv_theme_t* base_theme = lv_theme_basic_init(NULL); + lv_disp_set_theme(NULL, base_theme); + static themes::Theme sTheme{}; + sTheme.Apply(); TouchWheelEncoder encoder(weak_touch_wheel); diff --git a/src/ui/screen_menu.cpp b/src/ui/screen_menu.cpp index 91e79dd5..743dc6fa 100644 --- a/src/ui/screen_menu.cpp +++ b/src/ui/screen_menu.cpp @@ -43,7 +43,6 @@ Menu::Menu(std::vector indexes) : indexes_(indexes) { for (database::IndexInfo& index : indexes_) { lv_obj_t* item = lv_list_add_btn(list, NULL, index.name.c_str()); - lv_obj_set_style_bg_color(item, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN | LV_STATE_FOCUSED); lv_obj_add_event_cb(item, item_click_cb, LV_EVENT_CLICKED, &index); lv_group_add_obj(group_, item); } diff --git a/src/ui/screen_track_browser.cpp b/src/ui/screen_track_browser.cpp index 38a361bf..93ca277e 100644 --- a/src/ui/screen_track_browser.cpp +++ b/src/ui/screen_track_browser.cpp @@ -165,7 +165,6 @@ auto TrackBrowser::AddResults(Position pos, text = "[ no data ]"; } lv_obj_t* item = lv_list_add_btn(list_, NULL, text->c_str()); - lv_obj_set_style_bg_color(item, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN | LV_STATE_FOCUSED); lv_obj_add_event_cb(item, item_click_cb, LV_EVENT_CLICKED, this); lv_obj_add_event_cb(item, item_select_cb, LV_EVENT_FOCUSED, this); lv_group_add_obj(group_, item); diff --git a/src/ui/themes.cpp b/src/ui/themes.cpp new file mode 100644 index 00000000..6ae59365 --- /dev/null +++ b/src/ui/themes.cpp @@ -0,0 +1,37 @@ +#include "themes.hpp" + +namespace ui { +namespace themes { + +static void theme_apply_cb(lv_theme_t* th, lv_obj_t* obj) { + reinterpret_cast(th->user_data)->Callback(obj); +} + +Theme::Theme() { + /*Initialize the styles*/ + lv_style_init(&button_style_); + lv_style_set_bg_color(&button_style_, lv_palette_main(LV_PALETTE_GREEN)); + lv_style_set_border_color(&button_style_, + lv_palette_darken(LV_PALETTE_GREEN, 3)); + lv_style_set_border_width(&button_style_, 1); + + lv_theme_t* parent_theme = lv_disp_get_theme(NULL); + theme_ = *parent_theme; + theme_.user_data = this; + + /*Set the parent theme and the style apply callback for the new theme*/ + lv_theme_set_parent(&theme_, parent_theme); + lv_theme_set_apply_cb(&theme_, theme_apply_cb); +} + +void Theme::Apply(void) { + lv_disp_set_theme(NULL, &theme_); +} + +void Theme::Callback(lv_obj_t* obj) { + if (lv_obj_check_type(obj, &lv_btn_class) || lv_obj_check_type(obj, &lv_list_btn_class)) { + lv_obj_add_style(obj, &button_style_, 0); + } +} +} // namespace themes +} // namespace ui \ No newline at end of file