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/drivers/relative_wheel.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/drivers/relative_wheel.cpp (limited to 'src/drivers/relative_wheel.cpp') diff --git a/src/drivers/relative_wheel.cpp b/src/drivers/relative_wheel.cpp new file mode 100644 index 00000000..f64d213d --- /dev/null +++ b/src/drivers/relative_wheel.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "relative_wheel.hpp" + +#include +#include + +#include "esp_log.h" + +namespace drivers { + +RelativeWheel::RelativeWheel(TouchWheel *touch) + :touch_(touch), + is_pressed_(false), + is_first_read_(true), + ticks_(0), + last_angle_(0) {} + +auto RelativeWheel::Update() -> void { + touch_->Update(); + TouchWheelData d = touch_->GetTouchWheelData(); + is_pressed_ = d.is_touched; + + uint8_t new_angle = d.wheel_position; + if (is_first_read_) { + is_first_read_ = false; + last_angle_ = new_angle; + 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); + + last_angle_ = new_angle; + + // Round to eliminate noise. + if (change <= 2) { + 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_pressed() -> bool { + return is_pressed_; +} + +auto RelativeWheel::ticks() -> std::int_fast16_t { + int_fast16_t t = ticks_; + if (t != 0) { + ESP_LOGI("teeks", "ticks %d", t); + } + ticks_ = 0; + return t; +} + + +} // namespace drivers -- cgit v1.2.3