diff options
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | src/ui/encoder_input.cpp | 358 | ||||
| -rw-r--r-- | src/ui/include/encoder_input.hpp | 107 | ||||
| -rw-r--r-- | src/ui/include/lvgl_task.hpp | 7 | ||||
| -rw-r--r-- | src/ui/include/ui_fsm.hpp | 5 | ||||
| -rw-r--r-- | src/ui/lvgl_task.cpp | 15 | ||||
| -rw-r--r-- | src/ui/ui_fsm.cpp | 122 |
7 files changed, 68 insertions, 554 deletions
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 6d45fc9f..3814e9d5 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -3,9 +3,9 @@ # SPDX-License-Identifier: GPL-3.0-only idf_component_register( - SRCS "lvgl_task.cpp" "ui_fsm.cpp" "screen_splash.cpp" "encoder_input.cpp" - "themes.cpp" "screen.cpp" "modal.cpp" "screen_lua.cpp" - "splash.c" "font_fusion_12.c" "font_fusion_10.c" + SRCS "lvgl_task.cpp" "ui_fsm.cpp" "screen_splash.cpp" "themes.cpp" + "screen.cpp" "modal.cpp" "screen_lua.cpp" "splash.c" "font_fusion_12.c" + "font_fusion_10.c" INCLUDE_DIRS "include" - REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database" "esp_timer" "battery" "lua" "luavgl" "esp_app_format") + REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database" "esp_timer" "battery" "lua" "luavgl" "esp_app_format" "input") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/ui/encoder_input.cpp b/src/ui/encoder_input.cpp deleted file mode 100644 index 3b5af2c1..00000000 --- a/src/ui/encoder_input.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright 2023 jacqueline <me@jacqueline.id.au> - * - * SPDX-License-Identifier: GPL-3.0-only - */ - -#include "encoder_input.hpp" - -#include <sys/_stdint.h> -#include <memory> - -#include "lvgl.h" - -#include "audio_events.hpp" -#include "core/lv_event.h" -#include "core/lv_group.h" -#include "esp_timer.h" -#include "event_queue.hpp" -#include "gpios.hpp" -#include "hal/lv_hal_indev.h" -#include "nvs.hpp" -#include "relative_wheel.hpp" -#include "touchwheel.hpp" -#include "ui_events.hpp" - -[[maybe_unused]] static constexpr char kTag[] = "input"; - -constexpr int kDPadAngleThreshold = 10; -constexpr int kLongPressDelayMs = 500; -constexpr int kRepeatDelayMs = 250; - -static inline auto IsAngleWithin(int16_t wheel_angle, - int16_t target_angle, - int threshold) -> bool { - int16_t difference = (wheel_angle - target_angle + 127 + 255) % 255 - 127; - return difference <= threshold && difference >= -threshold; -} - -namespace ui { - -static void encoder_read(lv_indev_drv_t* drv, lv_indev_data_t* data) { - EncoderInput* instance = reinterpret_cast<EncoderInput*>(drv->user_data); - instance->Read(data); -} - -EncoderInput::EncoderInput(drivers::IGpios& gpios, drivers::TouchWheel& wheel) - : gpios_(gpios), - raw_wheel_(wheel), - relative_wheel_(std::make_unique<drivers::RelativeWheel>(wheel)), - scroller_(std::make_unique<Scroller>()), - mode_(drivers::NvsStorage::InputModes::kRotatingWheel), - is_locked_(false), - scroll_sensitivity_(10), - is_scrolling_wheel_(false) { - lv_indev_drv_init(&driver_); - driver_.type = LV_INDEV_TYPE_ENCODER; - driver_.read_cb = encoder_read; - driver_.user_data = this; - - registration_ = lv_indev_drv_register(&driver_); -} - -auto EncoderInput::Read(lv_indev_data_t* data) -> void { - if (is_locked_) { - return; - } - - lv_obj_t* active_object = nullptr; - if (registration_ && registration_->group) { - active_object = lv_group_get_focused(registration_->group); - } - - raw_wheel_.Update(); - relative_wheel_->Update(); - // GPIO (for volume buttons) updating is handled by system_fsm. - - uint64_t now_ms = esp_timer_get_time() / 1000; - - // Deal with the potential overflow of our timer. - for (auto& it : touch_time_ms_) { - if (it.second > now_ms) { - // esp_timer overflowed. - it.second = 0; - } - } - - // Check each button. - UpdateKeyState(Keys::kVolumeUp, now_ms, - !gpios_.Get(drivers::IGpios::Pin::kKeyUp)); - UpdateKeyState(Keys::kVolumeDown, now_ms, - !gpios_.Get(drivers::IGpios::Pin::kKeyDown)); - - drivers::TouchWheelData wheel_data = raw_wheel_.GetTouchWheelData(); - UpdateKeyState(Keys::kTouchWheel, now_ms, wheel_data.is_wheel_touched); - UpdateKeyState(Keys::kTouchWheelCenter, now_ms, wheel_data.is_button_touched); - - UpdateKeyState( - Keys::kDirectionalUp, now_ms, - wheel_data.is_wheel_touched && - IsAngleWithin(wheel_data.wheel_position, 0, kDPadAngleThreshold)); - UpdateKeyState( - Keys::kDirectionalLeft, now_ms, - wheel_data.is_wheel_touched && - IsAngleWithin(wheel_data.wheel_position, 63, kDPadAngleThreshold)); - UpdateKeyState( - Keys::kDirectionalDown, now_ms, - wheel_data.is_wheel_touched && - IsAngleWithin(wheel_data.wheel_position, 127, kDPadAngleThreshold)); - UpdateKeyState( - Keys::kDirectionalRight, now_ms, - wheel_data.is_wheel_touched && - IsAngleWithin(wheel_data.wheel_position, 189, kDPadAngleThreshold)); - - // When the wheel is being scrolled, we want to ensure that other inputs - // involving the touchwheel don't trigger. This guards again two main issues: - // - hesitating when your thumb is on a cardinal direction, causing an - // unintentional long-press, - // - drifting from the outside of the wheel in a way that causes the centre - // key to be triggered. - if (is_scrolling_wheel_) { - UpdateKeyState(Keys::kTouchWheelCenter, now_ms, false); - UpdateKeyState(Keys::kDirectionalUp, now_ms, false); - UpdateKeyState(Keys::kDirectionalLeft, now_ms, false); - UpdateKeyState(Keys::kDirectionalDown, now_ms, false); - UpdateKeyState(Keys::kDirectionalRight, now_ms, false); - } - - // Now that we've determined the correct state for all keys, we can start - // mapping key states into actions, depending on the current control scheme. - if (mode_ == drivers::NvsStorage::InputModes::kButtonsOnly) { - Trigger trigger; - data->state = LV_INDEV_STATE_RELEASED; - - trigger = TriggerKey(Keys::kVolumeUp, KeyStyle::kLongPress, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - data->enc_diff = -1; - break; - case Trigger::kLongPress: - events::Ui().Dispatch(internal::BackPressed{}); - break; - } - - trigger = TriggerKey(Keys::kVolumeDown, KeyStyle::kLongPress, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - data->enc_diff = 1; - break; - case Trigger::kLongPress: - data->state = LV_INDEV_STATE_PRESSED; - break; - } - } else if (mode_ == drivers::NvsStorage::InputModes::kDirectionalWheel) { - Trigger trigger; - trigger = TriggerKey(Keys::kTouchWheelCenter, KeyStyle::kLongPress, now_ms); - data->state = trigger == Trigger::kClick ? LV_INDEV_STATE_PRESSED - : LV_INDEV_STATE_RELEASED; - - trigger = TriggerKey(Keys::kDirectionalUp, KeyStyle::kRepeat, now_ms); - if (trigger == Trigger::kClick) { - data->enc_diff = scroller_->AddInput(now_ms, -1); - } - - trigger = TriggerKey(Keys::kDirectionalDown, KeyStyle::kRepeat, now_ms); - if (trigger == Trigger::kClick) { - data->enc_diff = scroller_->AddInput(now_ms, 1); - } - - trigger = TriggerKey(Keys::kDirectionalLeft, KeyStyle::kRepeat, now_ms); - if (trigger == Trigger::kClick) { - events::Ui().Dispatch(internal::BackPressed{}); - } - - trigger = TriggerKey(Keys::kDirectionalRight, KeyStyle::kRepeat, now_ms); - if (trigger == Trigger::kClick) { - // TODO: ??? - } - - // Cancel scrolling if the touchpad is released. - if (!touch_time_ms_.contains(Keys::kDirectionalUp) && - !touch_time_ms_.contains(Keys::kDirectionalDown)) { - data->enc_diff = scroller_->AddInput(now_ms, 0); - } - - trigger = TriggerKey(Keys::kVolumeUp, KeyStyle::kRepeat, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - events::Audio().Dispatch(audio::StepUpVolume{}); - break; - case Trigger::kLongPress: - break; - } - - trigger = TriggerKey(Keys::kVolumeDown, KeyStyle::kRepeat, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - events::Audio().Dispatch(audio::StepDownVolume{}); - break; - case Trigger::kLongPress: - break; - } - } else if (mode_ == drivers::NvsStorage::InputModes::kRotatingWheel) { - if (!raw_wheel_.GetTouchWheelData().is_wheel_touched) { - // User has released the wheel. - is_scrolling_wheel_ = false; - data->enc_diff = scroller_->AddInput(now_ms, 0); - } else if (relative_wheel_->ticks() != 0) { - // User is touching the wheel, and has just passed the sensitivity - // threshold for a scroll tick. - is_scrolling_wheel_ = true; - data->enc_diff = scroller_->AddInput(now_ms, relative_wheel_->ticks()); - } else { - // User is touching the wheel, but hasn't moved. - data->enc_diff = 0; - } - - Trigger trigger = - TriggerKey(Keys::kTouchWheelCenter, KeyStyle::kLongPress, now_ms); - switch (trigger) { - case Trigger::kNone: - data->state = LV_INDEV_STATE_RELEASED; - break; - case Trigger::kClick: - data->state = LV_INDEV_STATE_PRESSED; - break; - case Trigger::kLongPress: - if (active_object) { - lv_event_send(active_object, LV_EVENT_LONG_PRESSED, NULL); - } - break; - } - - trigger = TriggerKey(Keys::kVolumeUp, KeyStyle::kRepeat, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - events::Audio().Dispatch(audio::StepUpVolume{}); - break; - case Trigger::kLongPress: - break; - } - - trigger = TriggerKey(Keys::kVolumeDown, KeyStyle::kRepeat, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - events::Audio().Dispatch(audio::StepDownVolume{}); - break; - case Trigger::kLongPress: - break; - } - - trigger = TriggerKey(Keys::kDirectionalLeft, KeyStyle::kLongPress, now_ms); - switch (trigger) { - case Trigger::kNone: - break; - case Trigger::kClick: - break; - case Trigger::kLongPress: - events::Ui().Dispatch(internal::BackPressed{}); - break; - } - } -} - -auto EncoderInput::scroll_sensitivity(uint8_t val) -> void { - scroll_sensitivity_ = val; - relative_wheel_->SetSensitivity(scroll_sensitivity_); -} - -auto EncoderInput::UpdateKeyState(Keys key, uint64_t ms, bool clicked) -> void { - if (clicked) { - if (!touch_time_ms_.contains(key)) { - // Key was just clicked. - touch_time_ms_[key] = ms; - just_released_.erase(key); - fired_.erase(key); - } - return; - } - - // Key is not clicked. - if (touch_time_ms_.contains(key)) { - // Key was just released. - just_released_.insert(key); - touch_time_ms_.erase(key); - } -} - -auto EncoderInput::TriggerKey(Keys key, KeyStyle s, uint64_t ms) -> Trigger { - if (s == KeyStyle::kRepeat) { - bool may_repeat = fired_.contains(key) && touch_time_ms_.contains(key) && - ms - touch_time_ms_[key] >= kRepeatDelayMs; - - // Repeatable keys trigger on press. - if (touch_time_ms_.contains(key) && (!fired_.contains(key) || may_repeat)) { - fired_.insert(key); - return Trigger::kClick; - } else { - return Trigger::kNone; - } - } else if (s == KeyStyle::kLongPress) { - // Long press keys trigger on release, or after holding for a delay. - if (just_released_.contains(key)) { - just_released_.erase(key); - if (!fired_.contains(key)) { - fired_.insert(key); - return Trigger::kClick; - } - } - if (touch_time_ms_.contains(key) && - ms - touch_time_ms_[key] >= kLongPressDelayMs && - !fired_.contains(key)) { - fired_.insert(key); - return Trigger::kLongPress; - } - } - - return Trigger::kNone; -} - -auto Scroller::AddInput(uint64_t ms, int direction) -> int { - bool dir_changed = - ((velocity_ < 0 && direction > 0) || (velocity_ > 0 && direction < 0)); - if (direction == 0 || dir_changed) { - last_input_ms_ = ms; - velocity_ = 0; - return 0; - } - // Decay with time - if (last_input_ms_ > ms) { - last_input_ms_ = 0; - } - uint diff = ms - last_input_ms_; - uint diff_steps = diff / 25; - last_input_ms_ = ms + (last_input_ms_ % 50); - // Use powers of two for our exponential decay so we can implement decay - // trivially via bit shifting. - velocity_ >>= diff_steps; - - velocity_ += direction * 1000; - if (velocity_ > 0) { - return (velocity_ + 500) / 1000; - } else { - return (velocity_ - 500) / 1000; - } -} -} // namespace ui diff --git a/src/ui/include/encoder_input.hpp b/src/ui/include/encoder_input.hpp deleted file mode 100644 index 7dfac071..00000000 --- a/src/ui/include/encoder_input.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2023 jacqueline <me@jacqueline.id.au> - * - * SPDX-License-Identifier: GPL-3.0-only - */ - -#pragma once - -#include <stdint.h> -#include <deque> -#include <memory> -#include <set> - -#include "core/lv_group.h" -#include "gpios.hpp" -#include "hal/lv_hal_indev.h" - -#include "nvs.hpp" -#include "relative_wheel.hpp" -#include "touchwheel.hpp" - -namespace ui { - -class Scroller; - -/* - * Main input device abstracting that handles turning lower-level input device - * drivers into events and LVGL inputs. - * - * As far as LVGL is concerned, this class represents an ordinary rotary - * encoder, supporting only left and right ticks, and clicking. - */ -class EncoderInput { - public: - EncoderInput(drivers::IGpios& gpios, drivers::TouchWheel& wheel); - - auto Read(lv_indev_data_t* data) -> void; - auto registration() -> lv_indev_t* { return registration_; } - - auto mode(drivers::NvsStorage::InputModes mode) { mode_ = mode; } - auto scroll_sensitivity(uint8_t val) -> void; // Value between 0-255, used to scale the threshold - auto lock(bool l) -> void { is_locked_ = l; } - - private: - lv_indev_drv_t driver_; - lv_indev_t* registration_; - - drivers::IGpios& gpios_; - drivers::TouchWheel& raw_wheel_; - std::unique_ptr<drivers::RelativeWheel> relative_wheel_; - std::unique_ptr<Scroller> scroller_; - - drivers::NvsStorage::InputModes mode_; - bool is_locked_; - uint8_t scroll_sensitivity_; - - // Every kind of distinct input that we could map to an action. - enum class Keys { - kVolumeUp, - kVolumeDown, - kTouchWheel, - kTouchWheelCenter, - kDirectionalUp, - kDirectionalRight, - kDirectionalDown, - kDirectionalLeft, - }; - - // Map from a Key, to the time that it was first touched in ms. If the key is - // currently released, where will be no entry. - std::unordered_map<Keys, uint64_t> touch_time_ms_; - // Set of keys that were released during the current update. - std::set<Keys> just_released_; - // Set of keys that have had an event fired for them since being pressed. - std::set<Keys> fired_; - - bool is_scrolling_wheel_; - - enum class Trigger { - kNone, - // Regular short-click. Triggered on release for long-pressable keys, - // triggered on the initial press for repeatable keys. - kClick, - kLongPress, - }; - - enum class KeyStyle { - kRepeat, - kLongPress, - }; - - auto UpdateKeyState(Keys key, uint64_t ms, bool clicked) -> void; - auto TriggerKey(Keys key, KeyStyle t, uint64_t ms) -> Trigger; -}; - -class Scroller { - public: - Scroller() : last_input_ms_(0), velocity_(0) {} - - auto AddInput(uint64_t, int) -> int; - - private: - uint64_t last_input_ms_; - int velocity_; -}; - -} // namespace ui diff --git a/src/ui/include/lvgl_task.hpp b/src/ui/include/lvgl_task.hpp index f212ab9d..8efcbf35 100644 --- a/src/ui/include/lvgl_task.hpp +++ b/src/ui/include/lvgl_task.hpp @@ -15,8 +15,7 @@ #include "freertos/timers.h" #include "display.hpp" -#include "encoder_input.hpp" -#include "relative_wheel.hpp" +#include "lvgl_input_driver.hpp" #include "screen.hpp" #include "themes.hpp" #include "touchwheel.hpp" @@ -28,14 +27,14 @@ class UiTask { static auto Start() -> UiTask*; ~UiTask(); - auto input(std::shared_ptr<EncoderInput> input) -> void; + auto input(std::shared_ptr<input::LvglInputDriver> input) -> void; private: UiTask(); auto Main() -> void; - std::shared_ptr<EncoderInput> input_; + std::shared_ptr<input::LvglInputDriver> input_; std::shared_ptr<Screen> current_screen_; }; diff --git a/src/ui/include/ui_fsm.hpp b/src/ui/include/ui_fsm.hpp index 2bab487d..c238a447 100644 --- a/src/ui/include/ui_fsm.hpp +++ b/src/ui/include/ui_fsm.hpp @@ -14,14 +14,13 @@ #include "battery.hpp" #include "db_events.hpp" #include "display.hpp" -#include "encoder_input.hpp" #include "gpios.hpp" #include "lua_thread.hpp" +#include "lvgl_input_driver.hpp" #include "lvgl_task.hpp" #include "modal.hpp" #include "nvs.hpp" #include "property.hpp" -#include "relative_wheel.hpp" #include "screen.hpp" #include "service_locator.hpp" #include "storage.hpp" @@ -92,7 +91,7 @@ class UiState : public tinyfsm::Fsm<UiState> { static std::unique_ptr<UiTask> sTask; static std::shared_ptr<system_fsm::ServiceLocator> sServices; static std::unique_ptr<drivers::Display> sDisplay; - static std::shared_ptr<EncoderInput> sInput; + static std::shared_ptr<input::LvglInputDriver> sInput; static std::stack<std::shared_ptr<Screen>> sScreens; static std::shared_ptr<Screen> sCurrentScreen; diff --git a/src/ui/lvgl_task.cpp b/src/ui/lvgl_task.cpp index f0184766..4cf25c15 100644 --- a/src/ui/lvgl_task.cpp +++ b/src/ui/lvgl_task.cpp @@ -33,11 +33,11 @@ #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 "relative_wheel.hpp" #include "tasks.hpp" #include "touchwheel.hpp" #include "ui_fsm.hpp" @@ -50,8 +50,6 @@ namespace ui { [[maybe_unused]] static const char* kTag = "ui_task"; -static auto group_focus_cb(lv_group_t *group) -> void; - UiTask::UiTask() {} UiTask::~UiTask() { @@ -78,7 +76,6 @@ auto UiTask::Main() -> void { if (input_ && current_screen_->group() != current_group) { current_group = current_screen_->group(); lv_indev_set_group(input_->registration(), current_group); - lv_group_set_focus_cb(current_group, &group_focus_cb); } TickType_t delay = lv_timer_handler(); @@ -86,10 +83,9 @@ auto UiTask::Main() -> void { } } -auto UiTask::input(std::shared_ptr<EncoderInput> input) -> void { +auto UiTask::input(std::shared_ptr<input::LvglInputDriver> input) -> void { assert(current_screen_); input_ = input; - lv_indev_set_group(input_->registration(), current_screen_->group()); } auto UiTask::Start() -> UiTask* { @@ -98,11 +94,4 @@ auto UiTask::Start() -> UiTask* { return ret; } -static auto group_focus_cb(lv_group_t *group) -> void { - // TODO(robin): we probably want to vary this, configure this, etc - events::System().Dispatch(system_fsm::HapticTrigger{ - .effect = drivers::Haptics::Effect::kMediumClick1_100Pct, - }); -} - } // namespace ui diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp index 28733123..a9c1d3a3 100644 --- a/src/ui/ui_fsm.cpp +++ b/src/ui/ui_fsm.cpp @@ -30,19 +30,18 @@ #include "lauxlib.h" #include "lua_thread.hpp" #include "luavgl.h" +#include "lvgl_input_driver.hpp" #include "memory_resource.hpp" #include "misc/lv_gc.h" #include "audio_events.hpp" #include "display.hpp" -#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" -#include "relative_wheel.hpp" #include "samd.hpp" #include "screen.hpp" #include "screen_lua.hpp" @@ -63,7 +62,7 @@ namespace ui { std::unique_ptr<UiTask> UiState::sTask; std::shared_ptr<system_fsm::ServiceLocator> UiState::sServices; std::unique_ptr<drivers::Display> UiState::sDisplay; -std::shared_ptr<EncoderInput> UiState::sInput; +std::shared_ptr<input::LvglInputDriver> UiState::sInput; std::stack<std::shared_ptr<Screen>> UiState::sScreens; std::shared_ptr<Screen> UiState::sCurrentScreen; @@ -234,51 +233,58 @@ lua::Property UiState::sDisplayBrightness{ return true; }}; -lua::Property UiState::sControlsScheme{ - 0, [](const lua::LuaValue& val) { - if (!std::holds_alternative<int>(val)) { - return false; - } - drivers::NvsStorage::InputModes mode; - switch (std::get<int>(val)) { - case 0: - mode = drivers::NvsStorage::InputModes::kButtonsOnly; - break; - case 1: - mode = drivers::NvsStorage::InputModes::kButtonsWithWheel; - break; - case 2: - mode = drivers::NvsStorage::InputModes::kDirectionalWheel; - break; - case 3: - mode = drivers::NvsStorage::InputModes::kRotatingWheel; - break; - default: - return false; - } - sServices->nvs().PrimaryInput(mode); - sInput->mode(mode); - return true; - }}; - -lua::Property UiState::sScrollSensitivity{ - 0, [](const lua::LuaValue& val) { - std::optional<int> sensitivity = 0; - std::visit( - [&](auto&& v) { - using T = std::decay_t<decltype(v)>; - if constexpr (std::is_same_v<T, int>) { - sensitivity = v; - } - }, - val); - if (!sensitivity) { - return false; - } - sInput->scroll_sensitivity(*sensitivity); - sServices->nvs().ScrollSensitivity(*sensitivity); - return true; - }}; +lua::Property UiState::sControlsScheme{0, [](const lua::LuaValue& val) { + /* + if (!std::holds_alternative<int>(val)) + { return false; + } + drivers::NvsStorage::InputModes mode; + switch (std::get<int>(val)) { + case 0: + mode = + drivers::NvsStorage::InputModes::kButtonsOnly; + break; + case 1: + mode = + drivers::NvsStorage::InputModes::kButtonsWithWheel; + break; + case 2: + mode = + drivers::NvsStorage::InputModes::kDirectionalWheel; + break; + case 3: + mode = + drivers::NvsStorage::InputModes::kRotatingWheel; + break; + default: + return false; + } + sServices->nvs().PrimaryInput(mode); + sInput->mode(mode); + */ + return true; + }}; + +lua::Property UiState::sScrollSensitivity{0, [](const lua::LuaValue& val) { + /* + std::optional<int> sensitivity = 0; + std::visit( + [&](auto&& v) { + using T = + std::decay_t<decltype(v)>; if + constexpr (std::is_same_v<T, int>) { + sensitivity = v; + } + }, + val); + if (!sensitivity) { + return false; + } + sInput->scroll_sensitivity(*sensitivity); + sServices->nvs().ScrollSensitivity(*sensitivity); + */ + return true; + }}; lua::Property UiState::sLockSwitch{false}; @@ -372,7 +378,7 @@ void UiState::react(const internal::ControlSchemeChanged&) { if (!sInput) { return; } - sInput->mode(sServices->nvs().PrimaryInput()); + // sInput->mode(sServices->nvs().PrimaryInput()); } void UiState::react(const database::event::UpdateStarted&) { @@ -478,22 +484,8 @@ void Splash::react(const system_fsm::BootComplete& ev) { sDisplayBrightness.Update(brightness); sDisplay->SetBrightness(brightness); - auto touchwheel = sServices->touchwheel(); - if (touchwheel) { - sInput = std::make_shared<EncoderInput>(sServices->gpios(), **touchwheel); - - auto mode = sServices->nvs().PrimaryInput(); - sInput->mode(mode); - sControlsScheme.Update(static_cast<int>(mode)); - - auto sensitivity = sServices->nvs().ScrollSensitivity(); - sInput->scroll_sensitivity(sensitivity); - sScrollSensitivity.Update(static_cast<int>(sensitivity)); - - sTask->input(sInput); - } else { - ESP_LOGE(kTag, "no input devices initialised!"); - } + sInput = std::make_shared<input::LvglInputDriver>(sServices); + sTask->input(sInput); } void Splash::react(const system_fsm::StorageMounted&) { |
