From 6fd588e970470b15936187980829916d0dbe77bb Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 1 Jun 2023 15:28:32 +1000 Subject: Add touchwheel -> encoder adapter --- src/ui/wheel_encoder.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/ui/wheel_encoder.cpp (limited to 'src/ui/wheel_encoder.cpp') diff --git a/src/ui/wheel_encoder.cpp b/src/ui/wheel_encoder.cpp new file mode 100644 index 00000000..0129434d --- /dev/null +++ b/src/ui/wheel_encoder.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "wheel_encoder.hpp" +#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(drv->user_data); + instance->Read(data); +} + + TouchWheelEncoder::TouchWheelEncoder(std::weak_ptr wheel) : wheel_(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 TouchWheelEncoder::Read(lv_indev_data_t *data) -> void { + auto lock = wheel_.lock(); + if (lock == nullptr) { + data->state = LV_INDEV_STATE_RELEASED; + data->enc_diff = 0; + return; + } + + lock->Update(); + data->state = lock->is_pressed() ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->enc_diff = lock->ticks(); +} + +} // namespace ui -- cgit v1.2.3