From d1062f731ba4c5324b31ee637073105e4aece62a Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Thu, 18 Dec 2025 08:50:31 +0700 Subject: [PATCH] fix(trackpad): supress glitchy data on liftoff --- drivers/sensors/navigator_trackpad_ptp.c | 35 ++++++++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/drivers/sensors/navigator_trackpad_ptp.c b/drivers/sensors/navigator_trackpad_ptp.c index 159029dc1f..f2a2059fc1 100644 --- a/drivers/sensors/navigator_trackpad_ptp.c +++ b/drivers/sensors/navigator_trackpad_ptp.c @@ -267,6 +267,12 @@ static bool navigator_trackpad_ptp_task(void) { // Track previous finger state to detect lift-offs static bool prev_finger0_tip = false; static bool prev_finger1_tip = false; + // Cache last known good position for each finger (used during lift-off) + // This prevents garbage sensor data from creating phantom fingers + static uint16_t last_finger0_x = 0; + static uint16_t last_finger0_y = 0; + static uint16_t last_finger1_x = 0; + static uint16_t last_finger1_y = 0; uint32_t now = timer_read32(); @@ -314,20 +320,37 @@ static bool navigator_trackpad_ptp_task(void) { // Finger 0 (include if touching or lifting off) if (finger0_contact) { + // Use current sensor position if touching, cached position for lift-off + // This prevents garbage sensor data from creating phantom fingers + uint16_t x0 = finger0_tip ? sensor_report.fingers[0].x : last_finger0_x; + uint16_t y0 = finger0_tip ? sensor_report.fingers[0].y : last_finger0_y; build_finger_bytes(&report[PTP_FINGER0_OFFSET], 0, - scale_x(sensor_report.fingers[0].x), - scale_y(sensor_report.fingers[0].y), + scale_x(x0), + scale_y(y0), finger0_tip, - sensor_report.fingers[0].confidence); + finger0_tip ? sensor_report.fingers[0].confidence : false); } // Finger 1 (include if touching or lifting off) if (finger1_contact) { + // Use current sensor position if touching, cached position for lift-off + uint16_t x1 = finger1_tip ? sensor_report.fingers[1].x : last_finger1_x; + uint16_t y1 = finger1_tip ? sensor_report.fingers[1].y : last_finger1_y; build_finger_bytes(&report[PTP_FINGER1_OFFSET], 1, - scale_x(sensor_report.fingers[1].x), - scale_y(sensor_report.fingers[1].y), + scale_x(x1), + scale_y(y1), finger1_tip, - sensor_report.fingers[1].confidence); + finger1_tip ? sensor_report.fingers[1].confidence : false); + } + + // Update cached positions when fingers are actively touching + if (finger0_tip) { + last_finger0_x = sensor_report.fingers[0].x; + last_finger0_y = sensor_report.fingers[0].y; + } + if (finger1_tip) { + last_finger1_x = sensor_report.fingers[1].x; + last_finger1_y = sensor_report.fingers[1].y; } // Scan time (2 bytes, little-endian)