Skip to content

Commit d1062f7

Browse files
committed
fix(trackpad): supress glitchy data on liftoff
1 parent 9b08d56 commit d1062f7

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

drivers/sensors/navigator_trackpad_ptp.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)