|
|
|
/*
|
|
|
|
* Copyright 2023 jacqueline <me@jacqueline.id.au>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "relative_wheel.hpp"
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
#include "esp_log.h"
|
|
|
|
|
|
|
|
namespace drivers {
|
|
|
|
|
|
|
|
RelativeWheel::RelativeWheel(TouchWheel* touch)
|
|
|
|
: touch_(touch),
|
|
|
|
is_clicking_(false),
|
|
|
|
was_clicking_(false),
|
|
|
|
is_first_read_(true),
|
|
|
|
ticks_(0),
|
|
|
|
last_angle_(0) {}
|
|
|
|
|
|
|
|
auto RelativeWheel::Update() -> void {
|
|
|
|
touch_->Update();
|
|
|
|
TouchWheelData d = touch_->GetTouchWheelData();
|
|
|
|
|
|
|
|
is_clicking_ = d.is_button_touched;
|
|
|
|
|
|
|
|
if (!d.is_wheel_touched) {
|
|
|
|
is_first_read_ = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
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_clicking() -> bool {
|
|
|
|
bool ret = is_clicking_;
|
|
|
|
is_clicking_ = 0;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|