parent
f2bad894cd
commit
7d5536e2ab
@ -0,0 +1,46 @@ |
|||||||
|
/*
|
||||||
|
* 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 "core/lv_group.h" |
||||||
|
#include "gpios.hpp" |
||||||
|
#include "hal/lv_hal_indev.h" |
||||||
|
#include "relative_wheel.hpp" |
||||||
|
#include "touchwheel.hpp" |
||||||
|
|
||||||
|
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)) { |
||||||
|
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 { |
||||||
|
raw_wheel_.Update(); |
||||||
|
relative_wheel_->Update(); |
||||||
|
|
||||||
|
data->enc_diff = relative_wheel_->ticks(); |
||||||
|
data->state = relative_wheel_->is_clicking() ? LV_INDEV_STATE_PRESSED |
||||||
|
: LV_INDEV_STATE_RELEASED; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace ui
|
@ -0,0 +1,47 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <memory> |
||||||
|
|
||||||
|
#include "core/lv_group.h" |
||||||
|
#include "gpios.hpp" |
||||||
|
#include "hal/lv_hal_indev.h" |
||||||
|
|
||||||
|
#include "relative_wheel.hpp" |
||||||
|
#include "touchwheel.hpp" |
||||||
|
|
||||||
|
namespace ui { |
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 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_; |
||||||
|
|
||||||
|
bool is_locked_; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace ui
|
@ -1,33 +0,0 @@ |
|||||||
/*
|
|
||||||
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: GPL-3.0-only |
|
||||||
*/ |
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <memory> |
|
||||||
|
|
||||||
#include "core/lv_group.h" |
|
||||||
#include "hal/lv_hal_indev.h" |
|
||||||
|
|
||||||
#include "relative_wheel.hpp" |
|
||||||
|
|
||||||
namespace ui { |
|
||||||
|
|
||||||
class TouchWheelEncoder { |
|
||||||
public: |
|
||||||
explicit TouchWheelEncoder(std::unique_ptr<drivers::RelativeWheel> wheel); |
|
||||||
|
|
||||||
auto Read(lv_indev_data_t* data) -> void; |
|
||||||
auto registration() -> lv_indev_t* { return registration_; } |
|
||||||
|
|
||||||
private: |
|
||||||
lv_indev_drv_t driver_; |
|
||||||
lv_indev_t* registration_; |
|
||||||
|
|
||||||
lv_key_t last_key_; |
|
||||||
std::unique_ptr<drivers::RelativeWheel> wheel_; |
|
||||||
}; |
|
||||||
|
|
||||||
} // namespace ui
|
|
@ -1,44 +0,0 @@ |
|||||||
/*
|
|
||||||
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: GPL-3.0-only |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "wheel_encoder.hpp" |
|
||||||
#include <sys/_stdint.h> |
|
||||||
#include "core/lv_group.h" |
|
||||||
#include "hal/lv_hal_indev.h" |
|
||||||
|
|
||||||
namespace ui { |
|
||||||
|
|
||||||
void encoder_read(lv_indev_drv_t* drv, lv_indev_data_t* data) { |
|
||||||
TouchWheelEncoder* instance = |
|
||||||
reinterpret_cast<TouchWheelEncoder*>(drv->user_data); |
|
||||||
instance->Read(data); |
|
||||||
} |
|
||||||
|
|
||||||
void encoder_feedback(lv_indev_drv_t* drv, uint8_t event_code) { |
|
||||||
ESP_LOGI("Touchwheel Event", "Event code: %d", event_code); |
|
||||||
} |
|
||||||
|
|
||||||
TouchWheelEncoder::TouchWheelEncoder( |
|
||||||
std::unique_ptr<drivers::RelativeWheel> wheel) |
|
||||||
: last_key_(0), wheel_(std::move(wheel)) { |
|
||||||
lv_indev_drv_init(&driver_); |
|
||||||
driver_.type = LV_INDEV_TYPE_ENCODER; |
|
||||||
driver_.read_cb = encoder_read; |
|
||||||
// driver_.feedback_cb = encoder_feedback;
|
|
||||||
driver_.user_data = this; |
|
||||||
|
|
||||||
registration_ = lv_indev_drv_register(&driver_); |
|
||||||
} |
|
||||||
|
|
||||||
auto TouchWheelEncoder::Read(lv_indev_data_t* data) -> void { |
|
||||||
wheel_->Update(); |
|
||||||
|
|
||||||
data->enc_diff = wheel_->ticks(); |
|
||||||
data->state = |
|
||||||
wheel_->is_clicking() ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace ui
|
|
Loading…
Reference in new issue