diff --git a/firmware/application/touch.cpp b/firmware/application/touch.cpp index 681c25182..cb6028d73 100644 --- a/firmware/application/touch.cpp +++ b/firmware/application/touch.cpp @@ -81,16 +81,18 @@ void Manager::feed(const Frame& frame) { const auto touch_raw = frame.touch; //const auto touch_stable = touch_debounce.state(); 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. // TODO: Separate threshold to gate coordinates for filtering? if( touch_raw ) { const auto metrics = calculate_metrics(frame); - // TODO: Add touch pressure hysteresis? - touch_pressure = (metrics.r < r_touch_threshold); - if( touch_pressure ) { + touch_down_pressure = (metrics.r < r_touch_threshold); + touch_up_pressure = (metrics.r < r_touch_threshold*2); + + if( touch_down_pressure ) { filter_x.feed(metrics.x * 1024); filter_y.feed(metrics.y * 1024); } @@ -101,7 +103,7 @@ void Manager::feed(const Frame& frame) { switch(state) { 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() ) { state = State::TouchDetected; touch_started(); @@ -110,7 +112,7 @@ void Manager::feed(const Frame& frame) { break; case State::TouchDetected: - if( touch_stable && touch_pressure ) { + if( touch_stable && touch_up_pressure ) { touch_moved(); } else { state = State::NoTouch;