summaryrefslogtreecommitdiff
path: root/src/drivers/relative_wheel.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-07-11 15:43:38 +1000
committerjacqueline <me@jacqueline.id.au>2023-07-11 15:43:38 +1000
commitec71647d4d26928d3d4bdfdc537cd3da2ea7f29f (patch)
tree15be2f088522356544dd1b6c9114151774ee0de1 /src/drivers/relative_wheel.cpp
parent031cd99ea1b16de23a62f616684189fe46c0455f (diff)
parentd1d4b4a1ab63e9db9c8fc03e1c95fe732c37a0c2 (diff)
downloadtangara-fw-ec71647d4d26928d3d4bdfdc537cd3da2ea7f29f.tar.gz
Merge branch 'main' of git.sr.ht:~jacqueline/tangara-fw
Diffstat (limited to 'src/drivers/relative_wheel.cpp')
-rw-r--r--src/drivers/relative_wheel.cpp40
1 files changed, 17 insertions, 23 deletions
diff --git a/src/drivers/relative_wheel.cpp b/src/drivers/relative_wheel.cpp
index a631cd2e..74b1e022 100644
--- a/src/drivers/relative_wheel.cpp
+++ b/src/drivers/relative_wheel.cpp
@@ -27,8 +27,15 @@ auto RelativeWheel::Update() -> void {
is_clicking_ = d.is_button_touched;
+ if (is_clicking_) {
+ ticks_ = 0;
+ return;
+ }
+
if (!d.is_wheel_touched) {
+ ticks_ = 0;
is_first_read_ = true;
+ return;
}
uint8_t new_angle = d.wheel_position;
@@ -38,33 +45,20 @@ auto RelativeWheel::Update() -> void {
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);
+ int delta = 128 - last_angle_;
+ uint8_t rotated_angle = new_angle + delta;
+ int threshold = 15;
- last_angle_ = new_angle;
-
- // Round to eliminate noise.
- if (change <= 2) {
+ if (rotated_angle < 128 - threshold) {
+ ticks_ = 1;
+ last_angle_ = new_angle;
+ } else if (rotated_angle > 128 + threshold) {
+ ticks_ = -1;
+ last_angle_ = new_angle;
+ } else {
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 {