@@ -267,6 +267,12 @@ static bool navigator_trackpad_ptp_task(void) {
267267 // Track previous finger state to detect lift-offs
268268 static bool prev_finger0_tip = false;
269269 static bool prev_finger1_tip = false;
270+ // Cache last known good position for each finger (used during lift-off)
271+ // This prevents garbage sensor data from creating phantom fingers
272+ static uint16_t last_finger0_x = 0 ;
273+ static uint16_t last_finger0_y = 0 ;
274+ static uint16_t last_finger1_x = 0 ;
275+ static uint16_t last_finger1_y = 0 ;
270276
271277 uint32_t now = timer_read32 ();
272278
@@ -314,20 +320,37 @@ static bool navigator_trackpad_ptp_task(void) {
314320
315321 // Finger 0 (include if touching or lifting off)
316322 if (finger0_contact ) {
323+ // Use current sensor position if touching, cached position for lift-off
324+ // This prevents garbage sensor data from creating phantom fingers
325+ uint16_t x0 = finger0_tip ? sensor_report .fingers [0 ].x : last_finger0_x ;
326+ uint16_t y0 = finger0_tip ? sensor_report .fingers [0 ].y : last_finger0_y ;
317327 build_finger_bytes (& report [PTP_FINGER0_OFFSET ], 0 ,
318- scale_x (sensor_report . fingers [ 0 ]. x ),
319- scale_y (sensor_report . fingers [ 0 ]. y ),
328+ scale_x (x0 ),
329+ scale_y (y0 ),
320330 finger0_tip ,
321- sensor_report .fingers [0 ].confidence );
331+ finger0_tip ? sensor_report .fingers [0 ].confidence : false );
322332 }
323333
324334 // Finger 1 (include if touching or lifting off)
325335 if (finger1_contact ) {
336+ // Use current sensor position if touching, cached position for lift-off
337+ uint16_t x1 = finger1_tip ? sensor_report .fingers [1 ].x : last_finger1_x ;
338+ uint16_t y1 = finger1_tip ? sensor_report .fingers [1 ].y : last_finger1_y ;
326339 build_finger_bytes (& report [PTP_FINGER1_OFFSET ], 1 ,
327- scale_x (sensor_report . fingers [ 1 ]. x ),
328- scale_y (sensor_report . fingers [ 1 ]. y ),
340+ scale_x (x1 ),
341+ scale_y (y1 ),
329342 finger1_tip ,
330- sensor_report .fingers [1 ].confidence );
343+ finger1_tip ? sensor_report .fingers [1 ].confidence : false);
344+ }
345+
346+ // Update cached positions when fingers are actively touching
347+ if (finger0_tip ) {
348+ last_finger0_x = sensor_report .fingers [0 ].x ;
349+ last_finger0_y = sensor_report .fingers [0 ].y ;
350+ }
351+ if (finger1_tip ) {
352+ last_finger1_x = sensor_report .fingers [1 ].x ;
353+ last_finger1_y = sensor_report .fingers [1 ].y ;
331354 }
332355
333356 // Scan time (2 bytes, little-endian)
0 commit comments