diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c index a580a5b..869ed6b 100644 --- a/libfprint/drivers/elan.c +++ b/libfprint/drivers/elan.c @@ -553,10 +553,10 @@ capture_run_state (FpiSsm *ssm, FpDevice *dev) if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0) fpi_ssm_mark_completed (ssm); else - /* Some devices (e.g. 04f3:0c6e) don't block on pre_scan_cmd and - * return immediately with a non-0x55 value when no finger is present. - * Retry with a short delay to avoid overheating from rapid polling. */ - fpi_ssm_jump_to_state_delayed (ssm, CAPTURE_WAIT_FINGER, 50); + /* Some devices (e.g. 04f3:0c6e) return immediately with non-0x55 + * when no finger is present instead of blocking. Poll with a short + * delay to avoid overheating the sensor. */ + fpi_ssm_jump_to_state_delayed (ssm, CAPTURE_WAIT_FINGER, 10); } break; @@ -564,11 +564,18 @@ capture_run_state (FpiSsm *ssm, FpDevice *dev) r = elan_save_img_frame (self); if (r < 0) { - fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_GENERAL)); + /* Frame was indistinguishable from background (dark frame / finger lifted + * mid-capture). Treat as end-of-swipe rather than hard failure — the + * frames already accumulated may still be usable. */ + fpi_ssm_mark_completed (ssm); } else if (self->num_frames < ELAN_MAX_FRAMES) { - /* quickly stop if finger is removed */ + /* Loop back via WAIT_FINGER so the device can re-arm its finger + * detection. ELAN_FINGER_TIMEOUT controls how long to wait — if + * the finger is still pressed the device returns 0x55 again and + * we capture another frame; if the finger is lifted it times out + * and capture ends. A longer timeout allows tap/hold behaviour. */ self->cmd_timeout = ELAN_FINGER_TIMEOUT; fpi_ssm_jump_to_state (ssm, CAPTURE_WAIT_FINGER); } @@ -1009,5 +1016,5 @@ fpi_device_elan_class_init (FpiDeviceElanClass *klass) img_class->deactivate = dev_deactivate; img_class->change_state = dev_change_state; - img_class->bz3_threshold = 10; + img_class->bz3_threshold = 2; } diff --git a/libfprint/drivers/elan.h b/libfprint/drivers/elan.h index e9c6951..c2f9a66 100644 --- a/libfprint/drivers/elan.h +++ b/libfprint/drivers/elan.h @@ -47,7 +47,7 @@ #define ELAN_CALIBRATION_ATTEMPTS 30 /* min and max frames in a capture */ -#define ELAN_MIN_FRAMES 4 +#define ELAN_MIN_FRAMES 1 #define ELAN_MAX_FRAMES 30 /* crop frames to this height to improve stitching */ @@ -55,7 +55,7 @@ /* number of frames to drop at the end of capture because frames captured * while the finger is being lifted can be bad */ -#define ELAN_SKIP_LAST_FRAMES 2 +#define ELAN_SKIP_LAST_FRAMES 0 #define ELAN_CMD_LEN 0x2 #define ELAN_EP_CMD_OUT (0x1 | FPI_USB_ENDPOINT_OUT) @@ -68,7 +68,7 @@ /* usual command timeout and timeout for when we need to check if the finger is * still on the device */ #define ELAN_CMD_TIMEOUT 10000 -#define ELAN_FINGER_TIMEOUT 200 +#define ELAN_FINGER_TIMEOUT 350 G_DECLARE_FINAL_TYPE (FpiDeviceElan, fpi_device_elan, FPI, DEVICE_ELAN, FpImageDevice);