fixed touch handling issue causing multiple inputs

This commit is contained in:
bernd-herzog 2023-05-03 10:47:43 +02:00
parent ca143f9788
commit 77260bc68a

View File

@ -81,16 +81,18 @@ void Manager::feed(const Frame& frame) {
const auto touch_raw = frame.touch; const auto touch_raw = frame.touch;
//const auto touch_stable = touch_debounce.state(); //const auto touch_stable = touch_debounce.state();
const auto touch_stable = frame.touch; const auto touch_stable = frame.touch;
bool touch_pressure = false; bool touch_down_pressure = false;
bool touch_up_pressure = false;
// Only feed coordinate averaging if there's a touch. // Only feed coordinate averaging if there's a touch.
// TODO: Separate threshold to gate coordinates for filtering? // TODO: Separate threshold to gate coordinates for filtering?
if( touch_raw ) { if( touch_raw ) {
const auto metrics = calculate_metrics(frame); const auto metrics = calculate_metrics(frame);
// TODO: Add touch pressure hysteresis? touch_down_pressure = (metrics.r < r_touch_threshold);
touch_pressure = (metrics.r < r_touch_threshold); touch_up_pressure = (metrics.r < r_touch_threshold*2);
if( touch_pressure ) {
if( touch_down_pressure ) {
filter_x.feed(metrics.x * 1024); filter_x.feed(metrics.x * 1024);
filter_y.feed(metrics.y * 1024); filter_y.feed(metrics.y * 1024);
} }
@ -101,7 +103,7 @@ void Manager::feed(const Frame& frame) {
switch(state) { switch(state) {
case State::NoTouch: case State::NoTouch:
if( touch_stable && touch_pressure && !persistent_memory::disable_touchscreen()) { if( touch_stable && touch_down_pressure && !persistent_memory::disable_touchscreen()) {
if( point_stable() ) { if( point_stable() ) {
state = State::TouchDetected; state = State::TouchDetected;
touch_started(); touch_started();
@ -110,7 +112,7 @@ void Manager::feed(const Frame& frame) {
break; break;
case State::TouchDetected: case State::TouchDetected:
if( touch_stable && touch_pressure ) { if( touch_stable && touch_up_pressure ) {
touch_moved(); touch_moved();
} else { } else {
state = State::NoTouch; state = State::NoTouch;