secugen: Use device timeout rather than a custom one

This commit is contained in:
Marco Trevisan (Treviño)
2026-06-17 19:47:23 +02:00
parent 3af57e3483
commit 0c34a2b888
+32 -32
View File
@@ -120,7 +120,7 @@ struct _FpiDeviceSecugen
guint8 iface_num; /* Claimed USB interface number */ guint8 iface_num; /* Claimed USB interface number */
/* Finger detection */ /* Finger detection */
guint finger_poll_source; /* GLib timeout source ID */ GSource *finger_poll_source; /* Detection/finger-off timeout source */
/* Calibration / flat-field correction */ /* Calibration / flat-field correction */
guint8 *cal_raw; /* Background frame at raw sensor res (956x688) */ guint8 *cal_raw; /* Background frame at raw sensor res (956x688) */
@@ -1679,7 +1679,8 @@ enum detect_states {
}; };
static void detect_start (FpImageDevice *dev); static void detect_start (FpImageDevice *dev);
static gboolean detect_retry_cb (gpointer user_data); static void detect_retry_timeout (FpDevice *dev,
gpointer user_data G_GNUC_UNUSED);
static void static void
detect_run_state (FpiSsm *ssm, FpDevice *_dev) detect_run_state (FpiSsm *ssm, FpDevice *_dev)
@@ -1774,8 +1775,11 @@ detect_run_state (FpiSsm *ssm, FpDevice *_dev)
/* Schedule another poll */ /* Schedule another poll */
self->finger_poll_source = self->finger_poll_source =
g_timeout_add (SECUGEN_FINGER_POLL_MS, fpi_device_add_timeout (FP_DEVICE (dev),
(GSourceFunc) detect_retry_cb, dev); SECUGEN_FINGER_POLL_MS,
detect_retry_timeout,
NULL,
NULL);
} }
fpi_ssm_mark_completed (ssm); fpi_ssm_mark_completed (ssm);
@@ -1784,16 +1788,14 @@ detect_run_state (FpiSsm *ssm, FpDevice *_dev)
} }
} }
static gboolean static void
detect_retry_cb (gpointer user_data) detect_retry_timeout (FpDevice *dev, gpointer user_data G_GNUC_UNUSED)
{ {
FpImageDevice *dev = FP_IMAGE_DEVICE (user_data); FpImageDevice *img_dev = FP_IMAGE_DEVICE (dev);
FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (dev); FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (img_dev);
self->finger_poll_source = 0; self->finger_poll_source = NULL;
detect_start (dev); detect_start (img_dev);
return G_SOURCE_REMOVE;
} }
static void static void
@@ -1829,16 +1831,14 @@ detect_start (FpImageDevice *dev)
fpi_ssm_start (ssm, detect_ssm_complete); fpi_ssm_start (ssm, detect_ssm_complete);
} }
static gboolean static void
finger_off_cb (gpointer user_data) finger_off_timeout (FpDevice *dev, gpointer user_data G_GNUC_UNUSED)
{ {
FpImageDevice *dev = FP_IMAGE_DEVICE (user_data); FpImageDevice *img_dev = FP_IMAGE_DEVICE (dev);
FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (dev); FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (img_dev);
self->finger_poll_source = 0; self->finger_poll_source = NULL;
fpi_image_device_report_finger_status (dev, FALSE); fpi_image_device_report_finger_status (img_dev, FALSE);
return G_SOURCE_REMOVE;
} }
/* ================================================================ /* ================================================================
@@ -1918,6 +1918,8 @@ dev_deinit (FpImageDevice *dev)
FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (dev); FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (dev);
GError *error = NULL; GError *error = NULL;
g_clear_pointer (&self->finger_poll_source, g_source_destroy);
g_clear_pointer (&self->cal_raw, g_free); g_clear_pointer (&self->cal_raw, g_free);
g_clear_pointer (&self->bulk_buffer, g_free); g_clear_pointer (&self->bulk_buffer, g_free);
g_clear_pointer (&self->fw_data, g_free); g_clear_pointer (&self->fw_data, g_free);
@@ -2001,11 +2003,7 @@ dev_deactivate (FpImageDevice *dev)
FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (dev); FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (dev);
/* Cancel any pending timeout */ /* Cancel any pending timeout */
if (self->finger_poll_source) g_clear_pointer (&self->finger_poll_source, g_source_destroy);
{
g_source_remove (self->finger_poll_source);
self->finger_poll_source = 0;
}
/* If an init/detect/capture SSM is still in flight, defer completion until /* If an init/detect/capture SSM is still in flight, defer completion until
* it unwinds - its completion handler calls secugen_finish_deactivate(). This * it unwinds - its completion handler calls secugen_finish_deactivate(). This
@@ -2070,11 +2068,7 @@ dev_change_state (FpImageDevice *dev,
fp_dbg ("Starting image capture"); fp_dbg ("Starting image capture");
/* Cancel timeout if still running */ /* Cancel timeout if still running */
if (self->finger_poll_source) g_clear_pointer (&self->finger_poll_source, g_source_destroy);
{
g_source_remove (self->finger_poll_source);
self->finger_poll_source = 0;
}
self->ssm_count++; self->ssm_count++;
ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state, ssm = fpi_ssm_new (FP_DEVICE (dev), capture_run_state,
@@ -2085,7 +2079,11 @@ dev_change_state (FpImageDevice *dev,
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF: case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF:
fp_dbg ("Waiting for finger off"); fp_dbg ("Waiting for finger off");
self->finger_poll_source = g_timeout_add (500, finger_off_cb, dev); self->finger_poll_source = fpi_device_add_timeout (FP_DEVICE (dev),
500,
finger_off_timeout,
NULL,
NULL);
break; break;
case FPI_IMAGE_DEVICE_STATE_IDLE: case FPI_IMAGE_DEVICE_STATE_IDLE:
@@ -2110,7 +2108,7 @@ fpi_device_secugen_init (FpiDeviceSecugen *self)
{ {
self->init_reg_idx = 0; self->init_reg_idx = 0;
self->fw_read_idx = 0; self->fw_read_idx = 0;
self->finger_poll_source = 0; self->finger_poll_source = NULL;
self->exposure = SECUGEN_EXPOSURE_NORMAL; self->exposure = SECUGEN_EXPOSURE_NORMAL;
self->deactivating = FALSE; self->deactivating = FALSE;
self->ssm_count = 0; self->ssm_count = 0;
@@ -2121,6 +2119,8 @@ fpi_device_secugen_finalize (GObject *object)
{ {
FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (object); FpiDeviceSecugen *self = FPI_DEVICE_SECUGEN (object);
g_clear_pointer (&self->finger_poll_source, g_source_destroy);
/* Safety net: free heap buffers even if img_close never ran (e.g. an /* Safety net: free heap buffers even if img_close never ran (e.g. an
* activation failure tore the device down before dev_deinit). */ * activation failure tore the device down before dev_deinit). */
g_clear_pointer (&self->cal_raw, g_free); g_clear_pointer (&self->cal_raw, g_free);